题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解法
我的答案----暴力求解
遍历两次,代码如下
1 // kurrrr 2 class Solution { 3 public: 4 vector<int> twoSum(vector<int>& nums, int target) { 5 vector<int> answer; 6 for(int i=0; i<nums.size(); i++){ 7 for(int j=i+1; j<nums.size(); j++){ 8 if(j==i) continue; 9 if((target-nums[i]) == nums[j]){ 10 answer.push_back(i); 11 answer.push_back(j); 12 break; 13 } 14 } 15 } 16 return answer; 17 } 18 }; 19 20 21 22 // leetcode 23 class Solution { 24 public int[] twoSum(int[] nums, int target) { 25 for (int i = 0; i < nums.length; i++) { 26 for (int j = i + 1; j < nums.length; j++) { 27 if (nums[j] == target - nums[i]) { 28 return new int[] { i, j }; 29 } 30 } 31 } 32 throw new IllegalArgumentException("No two sum solution"); 33 } 34 }
建议解法----哈希表
哈希表:可以根据 key 值访问数据。
在这里,可以将数组值与其索引关联成哈希表,这样去寻找某特定值得时候就不用遍历数组,从而节省了时间复杂度。
1 class Solution { 2 public int[] twoSum(int[] nums, int target) { 3 Map<Integer, Integer> map = new HashMap<>(); 4 for (int i = 0; i < nums.length; i++) { 5 map.put(nums[i], i); 6 } 7 for (int i = 0; i < nums.length; i++) { 8 int complement = target - nums[i]; 9 if (map.containsKey(complement) && map.get(complement) != i) { 10 return new int[] { i, map.get(complement) }; 11 } 12 } 13 throw new IllegalArgumentException("No two sum solution"); 14 } 15 } 16 17 18 作者:LeetCode 19 链接:https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-2/ 20 来源:力扣(LeetCode) 21 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
说明
复杂度
时间复杂度:执行一段代码所消耗的时间,即代码执行了多少行。通常用大O表示,常用的时间复杂度有O(1),O(logn),O(n),O(n2).
空间复杂度:执行一段代码所消耗的内存。通常用大O表示,常用的空间复杂度有O(1),O(n),O(n2).