two pointers思想 ---- 利用两个i, j两个下标,同时对序列进行扫描,以O(n)复杂度解决问题的一种思想

two pointers思想 ---- 利用两个i, j两个下标,同时对序列进行扫描,以O(n)复杂度解决问题的一种思想, 如果能用这种思想解决问题,那么会大大降低程序的复杂度。

两个利用这个思想的例子:

1.

分析:

 代码:

 1 while (i < j){
 2         if (a[i] + a[j] == m){
 3             printf("%d %d\n", i, j);
 4             i++;
 5             j++;
 6         }
 7         else if (a[i] + a[j] < m){
 8             i++;
 9         }
10         else{
11             j++;
12         }
13     }

2.

思路:

代码:

 1 int merge(int A[], int B[], int C[], int n, int m){
 2     int i = 0, j = 0, index = 0;        // i指向A[0], j指向B[0]
 3     while (i < n && j < m){
 4         if (A[i] < B[j]){
 5             C[index++] = A[i++];
 6         }
 7         else if (A[i] > B[j]){
 8             C[index++] = B[j++];
 9         }
10         else{
11             C[index++] = A[i++];
12             j++;
13         }
14     }
15 
16     while (i < n)
17         C[index++] = A[i++];        // 将序列A的剩余元素加入序列C
18     while (j < m)
19         C[index++] = B[j++];        // 将序列B的剩余元素加入序列C
20 
21     return index;
22 }

猜你喜欢

转载自www.cnblogs.com/hi3254014978/p/12218844.html