leetcode 1.两数之和
题目:
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
思路分析:
1.最容易想到的应该是暴力解法, 通过遍历整个数组每个数,再次遍历数组,从中找target-nums[i]的数。 时间复杂度为O(n^2) 效率十分低下
1 public int[] twoSum(int[] nums, int target) { 2 for(int i=0;i<nums.length-1;i++){ 3 int temp=target-nums[i]; 4 for(int j=i+1;j<nums.length;j++){ 5 if(nums[j]==temp){ 6 return new int[]{i,j}; 7 } 8 } 9 } 10 return new int[] {}; 11 }
2.通过建立哈希表,我们可以通过用空间换时间的方法降低时间复杂度
通过数组的值和下标建立哈希表,遍历数组,若target-nums[i] 的值不存在于哈希表中则将[nums[i],i] 存入哈希表中
这样我们只需要遍历一次数组 即时间复杂度为O(n)
1 public int[] twoSum(int[] nums, int target) { 2 Map<Integer,Integer> map=new HashMap(); 3 for(int i=0;i<nums.length;i++){ 4 int temp=target-nums[i]; 5 if(map.get(temp)!=null){ 6 return new int[]{map.get(temp),i}; 7 } 8 else{ 9 map.put(nums[i],i); 10 } 11 } 12 return new int[]{}; 13 }

浙公网安备 33010602011771号