力扣算法01_求两数之和–简单
问题描述
给定一个整数数组 nums 和一个整数目标值 target,
请你在该数组中找出和为目标值 target的那两个整数
并返回它们的数组下标。
可以假设每种输入只会对应一个答案。
但是,数组中同一个元素在答案里不能重复出现(就是一个元素只能够使用一次)
如 输入:[1,2,3,4,5,6,6] 9
返回结果为:[2, 5]
解题思路:
方法一 暴力求解:
求一个数是数组中两个数的和,可以一个一个的尝试,采用两层循环,外层循环i从0到(length-2)
,内层循环j从i到(length-1)
,i与j一定不同,所以保证了一个元素只使用一次。然后再判断两下标所对应的元素之和是不是目标值。若是就返回。
时间复杂度为 n^2
//c++ 代码如下:
int* sum(int arrays[],int sum,int length){
static int a[2]; //c++不能把数组作为返回值,也不能返回局部变量。这里返回一个静态数组的指针
for(int i = 0; i < length - 1; i++){
for(int j = i + 1;j < length;j++){
if(sum == arrays[i]+arrays[j]){
a[0] = i;
a[1] = j;
return a;
}
}
}
return a;
}
方法二 采用hash表
使用hash表法 比暴力求解代码更加简单。
首先把数组全部放在一个hash表中 k为元素值,v为对应的数组下标。无需考虑放入元素的先后顺序
然后再循环遍历数组,第i个元素时,查找hash表中是否有元素k=target-nums[i]
,且i != k的v
若找到hash表中有元素符合上述条件,则返回
vector<int> twoSum(vector<int>& nums,int target){
// Vector是向量 也就是一个动态的数组
map<int,int> a;//建立一个hash表存放数组元素
vector<int> b(2,-1);//存放结果
for(int i=0;i<nums.size();i++)//将数组插入hash表中
a.insert(map<int,int>::value_type(nums[i],i));
for(int i=0;i<nums.size(); i++){
if(a.count(target-nums[i])>0 &&(a[target-nums[i]] != i)){
b[0] = i;
b[1] = a[target-nums[i]];
break;
}
}
return b;
}
解决方案:
提示:这里填写该问题的具体解决方案:
例如:新建一个 Message
对象,并将读取到的数据存入 Message
,然后 mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();
换成 mHandler.sendMessage()
。