Two Sum
Posted halu126
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Two Sum相关的知识,希望对你有一定的参考价值。
给定一个整数数组和一个指定的目标值,在数组中找到两个数加起来等于指定的目标值,返回这两个值的下标。
可以假设每个数组只有一个唯一的答案,切数组中没有重复的值:
例子:
Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].
1:双循环找出答案
1 public int[] twoSum(int[] nums, int target) { 2 int len; 3 if (nums == null || (len = nums.length) == 0) { 4 return null; 5 } 6 int[] ret = new int[2]; 7 8 boolean flag = false; 9 for (int i = 0; i < len - 1; i++) { 10 int a = nums[i]; 11 for (int j = i+1; j < len; j++) { 12 int b = nums[j]; 13 if (a + b == target) { 14 ret[0] = i; 15 ret[1] = j; 16 flag = true; 17 break; 18 } 19 } 20 if (flag) { 21 break; 22 } 23 } 24 return ret; 25 }
2,借助map,一次循环
1 public int[] twoSum(int[] nums, int target) { 2 int len; 3 if (nums == null || (len = nums.length) == 0) { 4 return null; 5 } 6 int[] ret = new int[2]; 7 int tekk = nums.length * 4 / 3; 8 Map<Integer, Integer> map = new HashMap<Integer, Integer>(tekk); 9 for (int i = 0; i < len; i++) { 10 int temp = target - nums[i]; 11 if (map.containsKey(temp)) { 12 ret[0] = map.get(temp); 13 ret[1] = i; 14 break; 15 } else { 16 map.put(nums[i], i); 17 } 18 } 19 return ret; 20 }
在使用HashMap时,不指定大小,初始大小是16,如果数值大于16会rehash,既然知道数组的大小,可以新建HashMap时直接给定初始大小
3,如果数组是有序的,可以一次循环找出答案
1 public int[] twoSum(int[] nums, int target) { 2 int len; 3 if (nums == null || (len = nums.length) == 0) { 4 return null; 5 } 6 int[] ret = {0, len-1}; 7 Arrays.sort(nums); 8 while (ret[0] < ret[1]) { 9 int a = nums[ret[0]]; 10 int b = nums[ret[1]]; 11 if (a + b == target) { 12 break; 13 } else if (a + b < target) { 14 ret[0]++; 15 } else if (a + b > target) { 16 ret[1]--; 17 } 18 } 19 return ret; 20 }
以上是关于Two Sum的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode #001# Two Sum详解(js描述)
Leetcode - 371. Sum of Two Integers