这个问题时刷题时遇到的,还是简单难度,使用的是最暴力的方法解决的问题,但是看了别人的答案,真的时自愧不如,只怪自己学识浅显。以后会经常更新一些题目。提高自己
原题如下:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
我的最原始解法
class Solution {
public int[] twoSum(int[] nums, int target) {
if(nums.length<2){
return null;
}
int r[] =new int[2];
for(int i=0;i<nums.length;i++){
for(int j=1+i;j<nums.length;j++){
if(target==(nums[i]+nums[j])){
r[0]=i;
r[1]=j;
return r;
}
}
}
return null;
}
}
结果虽然正确,但是用时过高。
但是时间复杂度为O(n2),再看看大神提交的时间,真是一山更比一山高。
* //第二种写法
* public int[] twoSum(int[] nums , int target){
* Map<Integer,Integer> map = new HashMap<Integer,Integer>();
* //先将数组存放在哈希表中
* for(int i:nums){
* map.put(nums[i],i);
* }
* for(int i =0; i<nums.length;i++){
* int co = target - nums[i];
* if(map.containsKey(co) && map.get(co)!=i){
* return new int []{co,map.get(co)};
* }
* }
* throw new IllegalArgumentException("无数据 ");
* }
* @param nums
* @param target
* @return
*/
// 第三种写法
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i:nums){
map.put(nums[i],i);
int co=target-nums[i];
if(map.containsKey(co) && map.get(co)!=i){
return new int[]{co,map.get(co)};
}
}
throw new IllegalArgumentException("无数据");
}