编程之美 2.12 快速寻找满足条件的两个数
2012-12-26 19:16
381 查看
从一个数组中找出两个数字,让这两个数字之和等于一个给定值。
解题思路:
第一印象是循环查找,从第一个数开始,取所有其后面的数与其相加,并判断是否为给定值。此复杂度为O(n2).
这种复杂度为O(n2)的解法,又是在一个无序的数组中,可以尝试先将其排序,再看排序后是否可以简化循环过程。下面是一个排序后的数组:
1,4,5,6,7,8,9
想要找相加和为N,则设置两个指针指向两端(p指向第一个,q指向最后一个),如果当前所指两个数相加大于N,则说明不可能还有在q所指元素之后与q所指元素相加会小于等于N,所以指针q向前移,如果两个数相加小于N,说明不可能还有数在指针p所指元素之前与当前所指元素相加会大于等于N,指针p向后移一位,直到p>=q或者找到相等的元素,结束循环。
书上还介绍了通过逆向思维,判断N-arr[i]是否在数组中,这种方法的优势在于可以用hash的方式存储数组,使得查找每个元素的时间复杂度降为O(1),不过多了O(N)的空间。在某些情况下,还是很有优势的。
解题思路:
第一印象是循环查找,从第一个数开始,取所有其后面的数与其相加,并判断是否为给定值。此复杂度为O(n2).
这种复杂度为O(n2)的解法,又是在一个无序的数组中,可以尝试先将其排序,再看排序后是否可以简化循环过程。下面是一个排序后的数组:
1,4,5,6,7,8,9
想要找相加和为N,则设置两个指针指向两端(p指向第一个,q指向最后一个),如果当前所指两个数相加大于N,则说明不可能还有在q所指元素之后与q所指元素相加会小于等于N,所以指针q向前移,如果两个数相加小于N,说明不可能还有数在指针p所指元素之前与当前所指元素相加会大于等于N,指针p向后移一位,直到p>=q或者找到相等的元素,结束循环。
typedef struct PAIR{ int a; int b; }Pair; Pair FindSum(int *arr, int i, int j, int N){ sort(arr + i, arr + j + 1); int tmp; Pair res; res.a = 0;res.b = 0; for (int x = i, y = j; x < y; ){ tmp = arr[x] + arr[y]; cout << tmp << endl; if(tmp < N) ++x; else if (tmp > N) --y; else{ res.a = arr[x]; res.b = arr[y]; return res; } } }
书上还介绍了通过逆向思维,判断N-arr[i]是否在数组中,这种方法的优势在于可以用hash的方式存储数组,使得查找每个元素的时间复杂度降为O(1),不过多了O(N)的空间。在某些情况下,还是很有优势的。
相关文章推荐
- 【编程之美】2.12快速寻找满足条件的两个数
- 读书笔记之编程之美 - 2.12 快速寻找满足条件的两个数
- [编程之美] PSet2.12 快速寻找满足条件的两个数
- 编程之美2.12——快速寻找满足条件的两个数或三个数
- 编程之美快速寻找满足条件的两个数
- 编程之美读书笔记2.12—快速寻找满足条件的两个数
- 快速寻找满足条件的两个数(编程之美2.12)
- 2.12快速寻找满足条件的两个数---程序员编程艺术之五
- 编程之美--快速寻找满足条件的两个数
- 编程之美 快速寻找满足条件的两个数
- 编程之美2.12--快速寻找满足条件的两个数
- 编程之美 2.12 快速寻找满足条件的两个数 解法三证明 (算法导论 第二版 2.3-7 在n个元素的集合S中找到两个和为x的元素)
- 编程之美_010快速寻找满足条件的两个数
- 编程之美-快速寻找满足条件的两个数
- [编程之美2.12]快速寻找满足条件的两个数及leetcode的3 sum closest 和 4 sum解析
- [编程之美]快速寻找满足条件的两个数
- 编程之美2.12——快速寻找满足条件的两个数或三个数
- 编程之美2.12 快速寻找满足条件的两个数
- 2.12 快速寻找满足条件的两个数
- 编程之美2.12 快速寻找满足条件的两个数