Two Sum 两数之和
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the sameelement twice.
Example:
1 2 3 4
| Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].
|
resolution
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
int* twoSum(int* nums, int numsSize, int target, int* returnSize){ int i, j; int *result = NULL; for(i = 0; i< numsSize -1; i++){ for(j = i + 1; j < numsSize; j++){ if(nums[i] + nums[j] == target){ result = (int *)malloc(sizeof(int)*2); result[0] = i; result[1] = j; *returnSize = 2; return result; } } } return result; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
class Solution{ public int[] twoSum(int[] nums, int target){ for (int i = 0; i < nums.length; i++ ){ for (int j = i + 1; j < nums.length; j++ ){ if ( nums[i] + nums[j] == target ){ return new int[] {i, j}; } } } throw new IllegalArgumentException("No Solution"); } }
|
Detail:
Time complexity: $O(n^2)$
n x n (row x column )
Space complexity: $O(1)$
Key: C malloc & calloc
Another Good Method:
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Solution{ public int[] twoSum(int[] nums, int target){ Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++){ int complement = target - num[i]; if(map.containsKey(complement)){ return new [] {map.get(complement), i}; } map.put(num[i], i); } throw new InllegalArgumentException("No Solution"); } }
|