在一组序列中查找两个元素的和等于给定的值(快排+两端扫描实现)
2017-03-14 19:55
330 查看
在一组序列中查找两个元素的和等于给定的值(快排+两端扫描实现)
题目描述:输入一个值Num,在一组序列中查找两个元素,若他们之和等于输入的值,则将他们挑选出来。
比如:{7,2,9,47,22,32,12,6,11,15}序列,输入14,则输出2和11。先将数组排序:{2,6,7,9,11,12,15,22,32,47},然后从i=0,j=9,i从前向后扫描,j从后向前扫描,如果两个数之和大于输入的Num,则j–,否则i++
// 定义一个结构体,方便函数返回两个参数 typedef struct result { int a; int b; }result;
// 快速排序法对数组排序 void fastsort(vector<int> &a,int lef, unsigned int rig) { int left = lef; int right = rig; int i = left; int j = right; int pos = a[left]; while(i<j) { while(i<j && a[j] >= pos) j--; if(i<j) swap(a[i],a[j]); while(i<j && a[i] <= pos) i++; if(i<j) swap(a[i],a[j]); } if (i != left) fastsort(a,left,i-1); if (j != right) fastsort(a,j+1,right); }
// 采用两端扫描法 result findTwoNumber(vector<int> &a,int Num) // 不能写成vector <int>a,因为如果是值传递,在该函数体内部调用fastsort(a,0,len) // 会产生一个新的拷贝,经过快排之后没法修改数组里的元素顺序 { struct result res; unsigned int len = a.size()-1; fastsort(a,0,len); for (int i=0;i<=len;i++) { cout << a[i] <<endl; } int begin = 0; int end = len; while (begin < end) { if(a[begin] + a[end] < Num) ++begin; else if(a[begin] + a[end] > Num) --end; else break; } res.a = a[begin]; res.b = a[end]; return res; } void swap(int i,int j) { int temp = i; j = i; i = temp; }
int main() { int a[10] = {7,2,9,47,22,32,12,6,11,15}; vector <int> arr; for (int i=0; i<10; i++) { arr.push_back(a[i]); } //cout << arr.size()<<endl; //fastsort(arr,0,arr.size()); result ans = findTwoNumber(arr,14); cout << ans.a <<endl; cout << ans.b <<endl; system("pause"); return 0; }
相关文章推荐
- Java实现——查找数组中连续元素的和等于给定数的子数组
- (1)顺序表的操作 ① 输入一组整型元素序列,建立线性表的顺序存储结构。 ② 实现该线性表的遍历。 ③ 在该顺序表中查找某一元素,查找成功显示查找元素,否则显示查找失败。 ④ 在该顺序表中删除或插入指
- 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数将其返回。 ⑤ 建立两个
- 判断序列中是否存在两个元素之和为x,时间复杂度O(nlgn),算法导论练习2.3,linux纯C实现
- js实现查找有序序列下的元素
- java每日一题:给定一个整数数组arr和整数target,返回两个索引值,使得这两个索引值对应的整数的和等于target。(arr中有且仅有一组)
- java实现 数组中两个元素相加等于指定数的所有组合
- 给定两个已排序序列,找出共同的元素
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 陈利人 面试题 给定两个字符串s和t(len(s)>len(t)),t可能是s的一个子序列。求所有s的子序列集合中,有多少个子序列等于t。
- Leet Code 1 Two Sum - 查找数组中和等于给定值的两个数 - Java
- 给定两个已排序序列,找出共同的元素
- (2)单链表的操作 ① 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数
- JAVA穷举法递归实现:查找一个数等于一组数中哪些数相加的和
- 在排序数组中查找和为给定值的两个数字 C++实现
- 描述一个运行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数 X 时,判断出S中是否存在有两个其和刚好等于 X 的元素。
- 在给定数组中,找出最先满足两个数的和等于给定数,输出这两个元素的下标
- 《算法导论》习题2.3-7 查找集合S中是否有两个元素和为X---Java实现
- 程序员面试题目总结--数组(二)【二分查找、找出给定数字出现次数、两个有序整型数组交集、找出数组中唯一的重复元素、判断数组中的数值是否连续相邻】
- 陈利人 面试题 给定两个字符串s和t(len(s)>len(t)),t可能是s的一个子序列。求所有s的子序列集合中,有多少个子序列等于t。