IT公司100题-14-排序数组中和为给定值的两个数字

问题描述:

输入一个升序排序的数组,给定一个目标值target,求数组的两个数a和b,a+b=target。如果有多个组合满足这个条件,输出任意一对即可。

例如,输入升序数组【1, 3, 4, 5, 13, 17】和目标值20。输出3和17。

分析:

最简单的办法,直接遍历,时间复杂度为O(n^2)。

双下标法:low和high

a[low]+a[high] < target, low++;

a[low]+a[high] > target, high–;

a[low]+a[high] == target, return low and high;

代码实现如下所示:

 1 // 14.cc
 2 #include
 3 using namespace std;
 4
 5 bool find_two(int* a, size_t size, int target, int& t1, int& t2) {
 6     bool flag = false;
 7     if (size < 2)
 8         return flag;
 9
10     size_t low = 0;
11     size_t high = size - 1;
12
13     while (low < high) {         int s = a[low] + a[high];         if (s > target)
14             high--;
15         else if (s < target)
16             low++;
17         else {
18             t1 = a[low];
19             t2 = a[high];
20             flag = true;
21             return flag;
22         }
23     }
24     return flag;
25 }
26
27 int main() {
28     int a[] = {1, 3, 4, 5, 13, 17};
29     int size = sizeof(a) / sizeof(int);
30     int target = 20;
31     int t1, t2;
32     bool flag = find_two(a, size, target, t1, t2);
33     if (flag)
34         cout << t1 << " + " << t2 << " = " << target << endl;
35     else
36         cout << "can not find t1 and t2." << endl;
37     return 0;
38 }

IT公司100题-14-排序数组中和为给定值的两个数字,布布扣,bubuko.com

时间: 2024-10-05 23:47:41

IT公司100题-14-排序数组中和为给定值的两个数字的相关文章

[程序员面试题精选100题]10.排序数组中和为给定值的两个数字

扩展(1):输入一个数组,判断这个数组中是不是存在三个数字i, j, k,满足i+j+k等于0. 扩展(2):如果输入的数组是没有排序的,但知道里面数字的范围,其他条件不变,如何在O(n)时间里找到这两个数字?这个的基本思路是先用哈希表实现O(n)的排序(请参照本面试题系列的第57题),接下来的步骤都一样了.

[程序猿面试题精选100题]10.排序数组中和为给定值的两个数字

剑指Offer之和为S的两个数字 剑指Offer之和为S的连续正数序列 扩展(1):输入一个数组,推断这个数组中是不是存在三个数字i, j, k,满足i+j+k等于0. 扩展(2):假设输入的数组是没有排序的,但知道里面数字的范围,其它条件不变,怎样在O(n)时间里找到这两个数字?这个的基本思路是先用哈希表实现O(n)的排序(请參照本面试题系列的第57题).接下来的步骤都一样了.

10.排序数组中和为给定值的两个数字

http://zhedahht.blog.163.com/blog/static/2541117420072143251809/ 题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字.要求时间复杂度是O(n).如果有多对数字的和等于输入的数字,输出任意一对即可. 例如输入数组1.2.4.7.11.15和数字15.由于4+11=15,因此输出4和11. 分析:如果我们不考虑时间复杂度,最简单想法的莫过去先在数组中固定一个数字,再依次判断数组中剩下的n

找出升序数组中和为给定值的两个数字

输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字.如果有多对数字的和等于输入的数字,输出任意一对即可. 详细描述: 接口说明 原型: bool FindTwoNumbersWithSum(int aData[], unsignedint uiLength, int sum, int *pNum1, int *pNum2); 输入参数: int aData[]           // 升序数组 unsigned int uiLength // 数组元

[LeetCode]1. Two Sum 数组中和为特定值的两个数

Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that

IT公司100题-12-求1+2+…+n

问题描述: 求1+2+…+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字以及条件判断语句(A?B:C). 分析: 利用类的静态变量实现: new一含有n个这种类的数组,那么该类的构造函数将会被调用n次. 代码实现: 1 // 12.cc 2 #include <iostream> 3 using namespace std; 4 5 class Object { 6 public: 7 Object() { 8 ++N; 9 Sum += N; 10

IT公司100题-9-判断整数序列是不是二元查找树的后序遍历结果

问题描述: 输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果. 如果是返回true,否则返回false. 例如输入4, 8, 6, 12, 16, 14, 10,由于这一整数序列是如下树的后序遍历结果: 10/     \6      14/  \    /   \4   8 12    16 因此返回true. 如果输入6, 5, 8, 5, 7 ,则返回false. 分析: 在后续遍历得到的序列中,最后一个元素为树的根结点.根节点元素将数组分为两部分,左边都小于根节点,右边都大

IT公司100题-5

题目:输入n个整数,输出其中最小的k个. 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数.只是这种思路的时间复杂度为O(nlogn).我们试着寻找更快的解决思路. 我们可以开辟一个长度为k的数组.每次从输入的n个整数中读入一个数.如果数组中已经插入的元素少于k个,则将读入的整数直接放到数组中.否则长度为k的数组已经满了,不能再往数组里插入元素,只能替换了.如果读入的这

IT公司100题-13-求链表中倒数第k个结点

问题描述: 输入一个单向链表,输出该链表中倒数第k个结点.链表倒数第0个节点为NULL. struct list_node { int data; list_node* next; }; 分析: 方法1: 首先计算出链表中节点的个数n,然后倒数第k个节点,为正数n-k+1个节点. 需要遍历链表2次. 方法1代码实现: 1 // 13_1.cc 2 #include <iostream> 3 using namespace std; 4 5 struct list_node { 6 int da