【剑指offer】【41】找出升序数组中和为给定值的两个数字
2017-09-29 20:22
375 查看
描述:
输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。如果有多对数字
的和等于输入的数字,输入任意一对即可。
例如输入数组1、2、4、7、11、15 和数字15。由于4+11=15,因此输出4和11。
分析:
(1)如果我们不考虑时间复杂度,最简单想法莫过于先在数组中固定一个数字,再依次判断数组中剩下的n-1个数字与它的和是不是等于输入的数字。可惜这种思路需要的时间复杂度是O(n^2)。
(2)最初我们找到数组的第一个数字和最后一个数字。当两个数字的和大于输入的数字时,把较大的数字往前移动;当两个数字的和小于输入数字时,把较小的数字往后移动;当相等时,打完收工。这样扫描的顺序是从数组的两端向数组的中间扫描。
输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。如果有多对数字
的和等于输入的数字,输入任意一对即可。
例如输入数组1、2、4、7、11、15 和数字15。由于4+11=15,因此输出4和11。
分析:
(1)如果我们不考虑时间复杂度,最简单想法莫过于先在数组中固定一个数字,再依次判断数组中剩下的n-1个数字与它的和是不是等于输入的数字。可惜这种思路需要的时间复杂度是O(n^2)。
(2)最初我们找到数组的第一个数字和最后一个数字。当两个数字的和大于输入的数字时,把较大的数字往前移动;当两个数字的和小于输入数字时,把较小的数字往后移动;当相等时,打完收工。这样扫描的顺序是从数组的两端向数组的中间扫描。
void findTwoNumber(int A[],int n,int sum){ //A是递增数组 int left = 0; int right = n - 1; int target1; int target2; while(left < right){ if(A[left] + A[right] > sum){ right--; } else if(A[left] + A[right] < sum){ left++; } else{//相等的时候就跳出 target1 = A[left]; target2 = A[right]; break; } } System.out.print(target1); System.out.print(target2); }
相关文章推荐
- 找出升序数组中和为给定值的两个数字
- 找出升序数组中和为给定值的两个数字 不要直接用形参里的表示,输出或清零输入时都是大忌
- 找出升序数组中和为给定值的两个数字
- 找出升序数组中和为给定值的两个数字
- 找出升序数组中和为给定值的两个数字
- 【剑指Offer-知识迁移能力】有序数组中和为S的两个数字
- 找出排序数组中和为给定值的两个数字
- 2.12 找出数组中和为给定的值的两个数字
- 剑指Offer38 数组所有数字出现两次,只有两个出现了一次,找出这两个数字
- 剑指Offer —— 找出数组中两个只出现了一次的数字
- [程序猿面试题精选100题]10.排序数组中和为给定值的两个数字
- 剑指offer 41 数组中只出现一次的数字
- 剑指offer 41题【知识迁移能力】和为S的两个数字
- 剑指Offer 41 和为s的两个数字vs和为s的连续正整数列
- [剑指offer][面试题41]和为s的两个数字 VS 和为s的连续正数序列
- 程序员面试题精选100题(10)-排序数组中和为给定值的两个数字[算法]
- 剑指Offer39 数组中寻找和为sum的两个数字
- 【剑指offer】之和为给定值的两个数字
- 【剑指offer-Java版】41和为s的两个数字VS和为s的连续正数序列
- 剑指Offer----面试题41(1):和为s的两个数字