Two Sum
来源:互联网 发布:少数民族人脸数据库 编辑:程序博客网 时间:2024/06/10 13:44
题意:给你一个包含n个数的数组,要求找出两个数,使得他们的和等于指定的数target。
思路:先在[1,n]之间确定一个index1,然后再在[index1+1,n]之间找index2,使得nums[index1]+num[index2]==target.按照这种思路不做任何优化,时间复杂度为O(n^2).
优化:先将数组排序,这样在找index2的时候就可以用二分查找了.时间复杂度O(nlogn)
排序后改变了原数组元素的位置,所以我的做法是先保存原数组,最后再根据找到的两个数反过去去找对应在原数组的位置。
class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { int n=nums.size(); vector<int>nums_back=nums;//保存原数组 Sort(nums,n); int index1,index2=-1; long low,mid,up; vector<int>ans; for(index1=1;index1<=n;index1++) { if(index2!=-1) break; low=index1+1;up=n; while(low<=up) { mid=(low+up)>>1; if(nums[mid-1]==target-nums[index1-1]) { index2=mid; index1--; break; } else if(nums[mid-1]<target-nums[index1-1]) low=mid+1; else up=mid-1; } } //找在原数组中对应的位置 for(int i=0;i<n;i++) if(nums_back[i]==nums[index1-1]||nums_back[i]==nums[index2-1]) ans.push_back(i+1); return ans; } //堆排序 void Sort(vector<int>& nums,int n) { int i; for(i=n>>1;i;i--) Adjust(nums,i,n); for(i=n-1;i;i--) { swap(nums[0],nums[i]); Adjust(nums,1,i); } } void Adjust(vector<int>& nums,int i,int n) { int lchild=i<<1; int rchild=lchild+1; int max=i; if(lchild<=n&&nums[max-1]<nums[lchild-1]) max=lchild; if(rchild<=n&&nums[max-1]<nums[rchild-1]) max=rchild; if(i!=max) { swap(nums[max-1],nums[i-1]); Adjust(nums,max,n); } }};
0 0
- Two Sum
- Two Sum
- Two Sum
- two sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- 韩顺平 java 第八讲第九讲 this、类变量、类方法、封装
- CSS3文本溢出
- Android 蓝牙开发小结与探讨
- Windows2008 Server 常规设置及基本安全策略
- 算法导论 O(n)时间内反转单链表
- Two Sum
- java.sql.SQLException: Lock wait timeout exceeded;
- Jbrowse中的BigWig Tracks配置
- iOS 进阶面试题-Block部分
- 浅析多线程及用法(实例)
- CString string CStringA CStringW string wstring 等字符串转换汇总
- 类似微博快速操作弹出界面
- 汇编语言第二版-第一章
- Xcode更新之后提示App Transport Security has blocked a cleartext HTTP(http://)resource load since it is ...