算法导论2.3-7(未排序数组) 和 剑指offer面试题41(排序数组)
来源:互联网 发布:php实战 商城系统开发 编辑:程序博客网 时间:2024/06/06 02:49
题目要求:
算法导论2.3-7:给出一个运行时间为O(nlgn)的算法,使之能在给定一个由n个整数组成的集合S和另个整数x时,判断S中是否存在有两个其和等于x的元素
剑指offer:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使它们的和恰好为S。 如果有多对数字的和为S,输出其中任意一对即可
算法导论的解题思路:都给数组先进行归并排序,时间复杂度为O(nlgn),后续做法两题一致
方法一:
1、使两个指针,分别指向数组头和尾部
2、计算和
2.1如果大于目标和,尾指针向前移动
2.2如果小于目标和,头指针向后移动
bool FindNumberWithSum(int *data,int length,int sum,int *num1,int *num2) { if(data==nullptr || length<=0 || num1==nullptr || num2==nullptr) return false; bool isfound = false; int fount = 0,tail = length -1; while(fount < tail) { if(data[fount] + data[tail]== sum) { isfound = true; *num1 = data[fount]; *num2 = data[tail]; break; } else if(data[fount] + data[tail] > sum) tail--; else fount++; } return isfound; }
代码中只有一个while循环从两端向中间扫描数组,因此算法的时间复杂度O(n)
方法二:运用二分查找法寻找y,y = x - a[i],算法的时间复杂度小于nlogn,所以总的时间复杂度还是nlogn。
//在已排序的数组上进行二分查找 bool binary_search(int a[],int v,int begin,int end) { int left=begin,right=end; int mid=0; while(left<=right){ mid=(left+right)/2; if(a[mid]==v) return True; else if(a[mid]<v) left=mid+1; else right=mid-1; } return false;} //查找数组a中是否存在两个数,其和为x bool check_sum(int a[],int n,int x) { sort(a);//用复杂度为O(nlgn)的排序算法对a进行排序,详见《排序》 for(int i=0;i<n;++i) if(binary_search(a,x-a[i],0,n-1)) return true; return false; }
0 0
- 算法导论2.3-7(未排序数组) 和 剑指offer面试题41(排序数组)
- 剑指Offer面试题38(Java版):数字在排序数组中出现的次数
- 剑指Offer面试题38(Java版):数字在排序数组中出现的次数
- 剑指offer--面试题53 在排序数组中查找数字(二分)
- 数字在排序数组中出现的次数(剑指offer面试题56)
- 【剑指offer】面试题53(1):数字在排序数组中出现的次数
- [剑指offer]面试题17:合并两个排序的数组
- 剑指Offer(第二版)面试题53:在排序数组中查找数字出现的次数
- 【剑指offer】2.4.1查找和排序——面试题8:旋转数组的最小数字
- 剑指Offer面试题8旋转数组的最小数字(二分查找)附带快排和按年龄排序
- 数组实现堆排序(来源算法导论)
- [剑指offer][面试题38]数字在排序数组中出现的次数
- 剑指offer面试题4拓展——已排序数组的合并
- 剑指offer之面试题36:数组中的逆序对-归并排序的应用
- 剑指Offer:面试题38 数字在排序数组中出现的次数
- 剑指offer 面试题38 排序数组中数字出现的次数
- 剑指offer面试题38:数字在排序数组中出现的次数
- 剑指offer 面试题38—数字在排序数组中出现的次数
- 设计模式(备忘录、职责链)
- Insert Delete GetRandom O(1) - Duplicates allowed
- Presto必知必会
- Android studio中向SVN上传项目
- 纯Java 实现控制台对数据库的增删改查(Eclipse)
- 算法导论2.3-7(未排序数组) 和 剑指offer面试题41(排序数组)
- 续上
- 大端模式和小端模式
- java的重载和重写机制
- 11章课后习题6
- ionic+angularjs开发的app自动升级
- Lightoj1433——Minimum Arc Distance (求弧长)
- 157.Unique Characters-判断字符串是否没有重复字符(容易题)
- 多线程Demo