标签:
https://leetcode.com/problems/two-sum/
水题一发吧,不过退役以来很少做题了,真是退步太厉害,没考虑全
题意:给一个数组,也一个target,问哪两个数加起来可以得到target
答案:桶排orHash
1、注意,桶排序,而且桶的深度不一定是1,所以hash[i]表示i个数而不是是不是存在
2、因为涉及下标,所以一定小心数组的数可以是分数,我的做法是,找到min(x[i]),如果min(x[i])<0,那么target+=-2*min(x[i]),x[i]+=(-1)*min(x[i]),
非常不习惯的是,LeetCode OJ居然没有给定数的范围,这个很头疼,数组开多大呢。。。
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { int tmp,cnt=0; int num[100001],id[100001]; int t = 0; memset(num,0,sizeof(num)); memset(id,0,sizeof(id)); for(int i=0;i<nums.size();i++){ tmp = nums[i]; t = min(t,tmp); } cnt=0; if(t<0){ t=-t; for(int i=0;i<nums.size();i++){ nums[i] += t; int tmp= nums[i]; num[tmp] ++; cnt++; id[tmp]=cnt; //cout << nums[i] << endl; } target += 2*t; }else{ for(int i=0;i<nums.size();i++){ int tmp= nums[i]; num[tmp] ++; cnt++; id[tmp]=cnt; //cout << nums[i] << endl; } } //cout << "ttt=" << target << " " << t << endl; int flag=0; vector<int>ans; for(int i=0;i<cnt;i++){ if( nums[i]<=target ){ if(num[target-nums[i]] ){ if(target-nums[i] == nums[i] && num[nums[i]]<2)continue; flag =1; ans.push_back(i+1); ans.push_back( id[ target-nums[i] ] ); //ans = i+id[ target-nums[i] ]; break; } } } return ans; } };
标签:
原文地址:http://blog.csdn.net/u011026968/article/details/45409025