Sort the coding languages by applications. (#721)

This commit is contained in:
Yudong Jin
2023-09-04 03:19:08 +08:00
committed by GitHub
parent 8d5e84f70a
commit 9c3b7b6422
55 changed files with 6826 additions and 6826 deletions
+60 -60
View File
@@ -43,10 +43,10 @@
值得注意的是,由于 $i$ 和 $j$ 都是 `int` 类型,**因此 $i + j$ 可能会超出 `int` 类型的取值范围**。为了避免大数越界,我们通常采用公式 $m = \lfloor {i + (j - i) / 2} \rfloor$ 来计算中点。
=== "Java"
=== "Python"
```java title="binary_search.java"
[class]{binary_search}-[func]{binarySearch}
```python title="binary_search.py"
[class]{}-[func]{binary_search}
```
=== "C++"
@@ -55,10 +55,16 @@
[class]{}-[func]{binarySearch}
```
=== "Python"
=== "Java"
```python title="binary_search.py"
[class]{}-[func]{binary_search}
```java title="binary_search.java"
[class]{binary_search}-[func]{binarySearch}
```
=== "C#"
```csharp title="binary_search.cs"
[class]{binary_search}-[func]{binarySearch}
```
=== "Go"
@@ -67,6 +73,12 @@
[class]{}-[func]{binarySearch}
```
=== "Swift"
```swift title="binary_search.swift"
[class]{}-[func]{binarySearch}
```
=== "JS"
```javascript title="binary_search.js"
@@ -79,30 +91,6 @@
[class]{}-[func]{binarySearch}
```
=== "C"
```c title="binary_search.c"
[class]{}-[func]{binarySearch}
```
=== "C#"
```csharp title="binary_search.cs"
[class]{binary_search}-[func]{binarySearch}
```
=== "Swift"
```swift title="binary_search.swift"
[class]{}-[func]{binarySearch}
```
=== "Zig"
```zig title="binary_search.zig"
[class]{}-[func]{binarySearch}
```
=== "Dart"
```dart title="binary_search.dart"
@@ -115,6 +103,18 @@
[class]{}-[func]{binary_search}
```
=== "C"
```c title="binary_search.c"
[class]{}-[func]{binarySearch}
```
=== "Zig"
```zig title="binary_search.zig"
[class]{}-[func]{binarySearch}
```
**时间复杂度 $O(\log n)$** :在二分循环中,区间每轮缩小一半,循环次数为 $\log_2 n$ 。
**空间复杂度 $O(1)$** :指针 $i$ 和 $j$ 使用常数大小空间。
@@ -125,10 +125,10 @@
我们可以基于该表示实现具有相同功能的二分查找算法。
=== "Java"
=== "Python"
```java title="binary_search.java"
[class]{binary_search}-[func]{binarySearchLCRO}
```python title="binary_search.py"
[class]{}-[func]{binary_search_lcro}
```
=== "C++"
@@ -137,10 +137,16 @@
[class]{}-[func]{binarySearchLCRO}
```
=== "Python"
=== "Java"
```python title="binary_search.py"
[class]{}-[func]{binary_search_lcro}
```java title="binary_search.java"
[class]{binary_search}-[func]{binarySearchLCRO}
```
=== "C#"
```csharp title="binary_search.cs"
[class]{binary_search}-[func]{binarySearchLCRO}
```
=== "Go"
@@ -149,6 +155,12 @@
[class]{}-[func]{binarySearchLCRO}
```
=== "Swift"
```swift title="binary_search.swift"
[class]{}-[func]{binarySearchLCRO}
```
=== "JS"
```javascript title="binary_search.js"
@@ -161,30 +173,6 @@
[class]{}-[func]{binarySearchLCRO}
```
=== "C"
```c title="binary_search.c"
[class]{}-[func]{binarySearchLCRO}
```
=== "C#"
```csharp title="binary_search.cs"
[class]{binary_search}-[func]{binarySearchLCRO}
```
=== "Swift"
```swift title="binary_search.swift"
[class]{}-[func]{binarySearchLCRO}
```
=== "Zig"
```zig title="binary_search.zig"
[class]{}-[func]{binarySearchLCRO}
```
=== "Dart"
```dart title="binary_search.dart"
@@ -197,6 +185,18 @@
[class]{}-[func]{binary_search_lcro}
```
=== "C"
```c title="binary_search.c"
[class]{}-[func]{binarySearchLCRO}
```
=== "Zig"
```zig title="binary_search.zig"
[class]{}-[func]{binarySearchLCRO}
```
如下图所示,在两种区间表示下,二分查找算法的初始化、循环条件和缩小区间操作皆有所不同。
由于“双闭区间”表示中的左右边界都被定义为闭区间,因此指针 $i$ 和 $j$ 缩小区间操作也是对称的。这样更不容易出错,**因此一般建议采用“双闭区间”的写法**。
+60 -60
View File
@@ -15,10 +15,10 @@
当遇到以上两种情况时,直接返回 $-1$ 即可。
=== "Java"
=== "Python"
```java title="binary_search_edge.java"
[class]{binary_search_edge}-[func]{binarySearchLeftEdge}
```python title="binary_search_edge.py"
[class]{}-[func]{binary_search_left_edge}
```
=== "C++"
@@ -27,10 +27,16 @@
[class]{}-[func]{binarySearchLeftEdge}
```
=== "Python"
=== "Java"
```python title="binary_search_edge.py"
[class]{}-[func]{binary_search_left_edge}
```java title="binary_search_edge.java"
[class]{binary_search_edge}-[func]{binarySearchLeftEdge}
```
=== "C#"
```csharp title="binary_search_edge.cs"
[class]{binary_search_edge}-[func]{binarySearchLeftEdge}
```
=== "Go"
@@ -39,6 +45,12 @@
[class]{}-[func]{binarySearchLeftEdge}
```
=== "Swift"
```swift title="binary_search_edge.swift"
[class]{}-[func]{binarySearchLeftEdge}
```
=== "JS"
```javascript title="binary_search_edge.js"
@@ -51,30 +63,6 @@
[class]{}-[func]{binarySearchLeftEdge}
```
=== "C"
```c title="binary_search_edge.c"
[class]{}-[func]{binarySearchLeftEdge}
```
=== "C#"
```csharp title="binary_search_edge.cs"
[class]{binary_search_edge}-[func]{binarySearchLeftEdge}
```
=== "Swift"
```swift title="binary_search_edge.swift"
[class]{}-[func]{binarySearchLeftEdge}
```
=== "Zig"
```zig title="binary_search_edge.zig"
[class]{}-[func]{binarySearchLeftEdge}
```
=== "Dart"
```dart title="binary_search_edge.dart"
@@ -87,6 +75,18 @@
[class]{}-[func]{binary_search_left_edge}
```
=== "C"
```c title="binary_search_edge.c"
[class]{}-[func]{binarySearchLeftEdge}
```
=== "Zig"
```zig title="binary_search_edge.zig"
[class]{}-[func]{binarySearchLeftEdge}
```
## 查找右边界
那么如何查找最右一个 `target` 呢?最直接的方式是修改代码,替换在 `nums[m] == target` 情况下的指针收缩操作。代码在此省略,有兴趣的同学可以自行实现。
@@ -103,10 +103,10 @@
请注意,返回的插入点是 $i$ ,因此需要将其减 $1$ ,从而获得 $j$ 。
=== "Java"
=== "Python"
```java title="binary_search_edge.java"
[class]{binary_search_edge}-[func]{binarySearchRightEdge}
```python title="binary_search_edge.py"
[class]{}-[func]{binary_search_right_edge}
```
=== "C++"
@@ -115,10 +115,16 @@
[class]{}-[func]{binarySearchRightEdge}
```
=== "Python"
=== "Java"
```python title="binary_search_edge.py"
[class]{}-[func]{binary_search_right_edge}
```java title="binary_search_edge.java"
[class]{binary_search_edge}-[func]{binarySearchRightEdge}
```
=== "C#"
```csharp title="binary_search_edge.cs"
[class]{binary_search_edge}-[func]{binarySearchRightEdge}
```
=== "Go"
@@ -127,6 +133,12 @@
[class]{}-[func]{binarySearchRightEdge}
```
=== "Swift"
```swift title="binary_search_edge.swift"
[class]{}-[func]{binarySearchRightEdge}
```
=== "JS"
```javascript title="binary_search_edge.js"
@@ -139,30 +151,6 @@
[class]{}-[func]{binarySearchRightEdge}
```
=== "C"
```c title="binary_search_edge.c"
[class]{}-[func]{binarySearchRightEdge}
```
=== "C#"
```csharp title="binary_search_edge.cs"
[class]{binary_search_edge}-[func]{binarySearchRightEdge}
```
=== "Swift"
```swift title="binary_search_edge.swift"
[class]{}-[func]{binarySearchRightEdge}
```
=== "Zig"
```zig title="binary_search_edge.zig"
[class]{}-[func]{binarySearchRightEdge}
```
=== "Dart"
```dart title="binary_search_edge.dart"
@@ -175,6 +163,18 @@
[class]{}-[func]{binary_search_right_edge}
```
=== "C"
```c title="binary_search_edge.c"
[class]{}-[func]{binarySearchRightEdge}
```
=== "Zig"
```zig title="binary_search_edge.zig"
[class]{}-[func]{binarySearchRightEdge}
```
### 转化为查找元素
我们知道,当数组不包含 `target` 时,最终 $i$ 和 $j$ 会分别指向首个大于、小于 `target` 的元素。
@@ -22,10 +22,10 @@
因此二分结束时一定有:$i$ 指向首个大于 `target` 的元素,$j$ 指向首个小于 `target` 的元素。**易得当数组不包含 `target` 时,插入索引为 $i$** 。
=== "Java"
=== "Python"
```java title="binary_search_insertion.java"
[class]{binary_search_insertion}-[func]{binarySearchInsertionSimple}
```python title="binary_search_insertion.py"
[class]{}-[func]{binary_search_insertion_simple}
```
=== "C++"
@@ -34,10 +34,16 @@
[class]{}-[func]{binarySearchInsertionSimple}
```
=== "Python"
=== "Java"
```python title="binary_search_insertion.py"
[class]{}-[func]{binary_search_insertion_simple}
```java title="binary_search_insertion.java"
[class]{binary_search_insertion}-[func]{binarySearchInsertionSimple}
```
=== "C#"
```csharp title="binary_search_insertion.cs"
[class]{binary_search_insertion}-[func]{binarySearchInsertionSimple}
```
=== "Go"
@@ -46,6 +52,12 @@
[class]{}-[func]{binarySearchInsertionSimple}
```
=== "Swift"
```swift title="binary_search_insertion.swift"
[class]{}-[func]{binarySearchInsertionSimple}
```
=== "JS"
```javascript title="binary_search_insertion.js"
@@ -58,30 +70,6 @@
[class]{}-[func]{binarySearchInsertionSimple}
```
=== "C"
```c title="binary_search_insertion.c"
[class]{}-[func]{binarySearchInsertionSimple}
```
=== "C#"
```csharp title="binary_search_insertion.cs"
[class]{binary_search_insertion}-[func]{binarySearchInsertionSimple}
```
=== "Swift"
```swift title="binary_search_insertion.swift"
[class]{}-[func]{binarySearchInsertionSimple}
```
=== "Zig"
```zig title="binary_search_insertion.zig"
[class]{}-[func]{binarySearchInsertionSimple}
```
=== "Dart"
```dart title="binary_search_insertion.dart"
@@ -94,6 +82,18 @@
[class]{}-[func]{binary_search_insertion}
```
=== "C"
```c title="binary_search_insertion.c"
[class]{}-[func]{binarySearchInsertionSimple}
```
=== "Zig"
```zig title="binary_search_insertion.zig"
[class]{}-[func]{binarySearchInsertionSimple}
```
## 存在重复元素的情况
!!! question
@@ -146,10 +146,10 @@
即便如此,我们仍然可以将判断条件保持展开,因为其逻辑更加清晰、可读性更好。
=== "Java"
=== "Python"
```java title="binary_search_insertion.java"
[class]{binary_search_insertion}-[func]{binarySearchInsertion}
```python title="binary_search_insertion.py"
[class]{}-[func]{binary_search_insertion}
```
=== "C++"
@@ -158,10 +158,16 @@
[class]{}-[func]{binarySearchInsertion}
```
=== "Python"
=== "Java"
```python title="binary_search_insertion.py"
[class]{}-[func]{binary_search_insertion}
```java title="binary_search_insertion.java"
[class]{binary_search_insertion}-[func]{binarySearchInsertion}
```
=== "C#"
```csharp title="binary_search_insertion.cs"
[class]{binary_search_insertion}-[func]{binarySearchInsertion}
```
=== "Go"
@@ -170,6 +176,12 @@
[class]{}-[func]{binarySearchInsertion}
```
=== "Swift"
```swift title="binary_search_insertion.swift"
[class]{}-[func]{binarySearchInsertion}
```
=== "JS"
```javascript title="binary_search_insertion.js"
@@ -182,30 +194,6 @@
[class]{}-[func]{binarySearchInsertion}
```
=== "C"
```c title="binary_search_insertion.c"
[class]{}-[func]{binarySearchInsertion}
```
=== "C#"
```csharp title="binary_search_insertion.cs"
[class]{binary_search_insertion}-[func]{binarySearchInsertion}
```
=== "Swift"
```swift title="binary_search_insertion.swift"
[class]{}-[func]{binarySearchInsertion}
```
=== "Zig"
```zig title="binary_search_insertion.zig"
[class]{}-[func]{binarySearchInsertion}
```
=== "Dart"
```dart title="binary_search_insertion.dart"
@@ -218,6 +206,18 @@
[class]{}-[func]{binary_search_insertion}
```
=== "C"
```c title="binary_search_insertion.c"
[class]{}-[func]{binarySearchInsertion}
```
=== "Zig"
```zig title="binary_search_insertion.zig"
[class]{}-[func]{binarySearchInsertion}
```
!!! tip
本节的代码都是“双闭区间”写法。有兴趣的读者可以自行实现“左闭右开”写法。
@@ -12,10 +12,10 @@
![线性查找求解两数之和](replace_linear_by_hashing.assets/two_sum_brute_force.png)
=== "Java"
=== "Python"
```java title="two_sum.java"
[class]{two_sum}-[func]{twoSumBruteForce}
```python title="two_sum.py"
[class]{}-[func]{two_sum_brute_force}
```
=== "C++"
@@ -24,10 +24,16 @@
[class]{}-[func]{twoSumBruteForce}
```
=== "Python"
=== "Java"
```python title="two_sum.py"
[class]{}-[func]{two_sum_brute_force}
```java title="two_sum.java"
[class]{two_sum}-[func]{twoSumBruteForce}
```
=== "C#"
```csharp title="two_sum.cs"
[class]{two_sum}-[func]{twoSumBruteForce}
```
=== "Go"
@@ -36,6 +42,12 @@
[class]{}-[func]{twoSumBruteForce}
```
=== "Swift"
```swift title="two_sum.swift"
[class]{}-[func]{twoSumBruteForce}
```
=== "JS"
```javascript title="two_sum.js"
@@ -48,30 +60,6 @@
[class]{}-[func]{twoSumBruteForce}
```
=== "C"
```c title="two_sum.c"
[class]{}-[func]{twoSumBruteForce}
```
=== "C#"
```csharp title="two_sum.cs"
[class]{two_sum}-[func]{twoSumBruteForce}
```
=== "Swift"
```swift title="two_sum.swift"
[class]{}-[func]{twoSumBruteForce}
```
=== "Zig"
```zig title="two_sum.zig"
[class]{}-[func]{twoSumBruteForce}
```
=== "Dart"
```dart title="two_sum.dart"
@@ -84,6 +72,18 @@
[class]{}-[func]{two_sum_brute_force}
```
=== "C"
```c title="two_sum.c"
[class]{}-[func]{twoSumBruteForce}
```
=== "Zig"
```zig title="two_sum.zig"
[class]{}-[func]{twoSumBruteForce}
```
此方法的时间复杂度为 $O(n^2)$ ,空间复杂度为 $O(1)$ ,在大数据量下非常耗时。
## 哈希查找:以空间换时间
@@ -104,10 +104,10 @@
实现代码如下所示,仅需单层循环即可。
=== "Java"
=== "Python"
```java title="two_sum.java"
[class]{two_sum}-[func]{twoSumHashTable}
```python title="two_sum.py"
[class]{}-[func]{two_sum_hash_table}
```
=== "C++"
@@ -116,10 +116,16 @@
[class]{}-[func]{twoSumHashTable}
```
=== "Python"
=== "Java"
```python title="two_sum.py"
[class]{}-[func]{two_sum_hash_table}
```java title="two_sum.java"
[class]{two_sum}-[func]{twoSumHashTable}
```
=== "C#"
```csharp title="two_sum.cs"
[class]{two_sum}-[func]{twoSumHashTable}
```
=== "Go"
@@ -128,6 +134,12 @@
[class]{}-[func]{twoSumHashTable}
```
=== "Swift"
```swift title="two_sum.swift"
[class]{}-[func]{twoSumHashTable}
```
=== "JS"
```javascript title="two_sum.js"
@@ -140,32 +152,6 @@
[class]{}-[func]{twoSumHashTable}
```
=== "C"
```c title="two_sum.c"
[class]{hashTable}-[func]{}
[class]{}-[func]{twoSumHashTable}
```
=== "C#"
```csharp title="two_sum.cs"
[class]{two_sum}-[func]{twoSumHashTable}
```
=== "Swift"
```swift title="two_sum.swift"
[class]{}-[func]{twoSumHashTable}
```
=== "Zig"
```zig title="two_sum.zig"
[class]{}-[func]{twoSumHashTable}
```
=== "Dart"
```dart title="two_sum.dart"
@@ -178,6 +164,20 @@
[class]{}-[func]{two_sum_hash_table}
```
=== "C"
```c title="two_sum.c"
[class]{hashTable}-[func]{}
[class]{}-[func]{twoSumHashTable}
```
=== "Zig"
```zig title="two_sum.zig"
[class]{}-[func]{twoSumHashTable}
```
此方法通过哈希查找将时间复杂度从 $O(n^2)$ 降低至 $O(n)$ ,大幅提升运行效率。
由于需要维护一个额外的哈希表,因此空间复杂度为 $O(n)$ 。**尽管如此,该方法的整体时空效率更为均衡,因此它是本题的最优解法**。