在有序数组中求两数之和(leetcode167)
一:解题思路
方法一:暴力破解法,Time:O(n^2),Space:O(1)
方法二:利用一个哈希表,Time:O(n),Space:O(n)
方法三:利用二分的思想。Time:O(log(n)),Space:O(1)
二:完整代码示例 (C、C++、Java、Python)
方法一C:
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) { int* result = (int*)malloc(sizeof(int)*2); int i = 0; int j = 0; for (i = 0; i < numbersSize; i++) { for (j = i+1; j < numbersSize; j++) { if (numbers[i] + numbers[j] == target) { result[0] = i + 1; result[1] = j + 1; break; } } } *returnSize = 2; return result; }
方法二C:
方法三C:
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) { int* result = (int*)malloc(sizeof(int)*2); int i = 0; int j = numbersSize-1; while (i < j) { if (numbers[i] + numbers[j] == target) { result[0] = i + 1; result[1] = j + 1; break; } else if (numbers[i] + numbers[j] < target) i++; else j--; } *returnSize = 2; return result; }
方法一C++:
class Solution { public: vector<int> twoSum(vector<int>& numbers, int target) { vector<int> result(2,-1); if (numbers.size() == 0) return result; for (int i = 0; i < numbers.size(); i++) { for (int j = i + 1; j < numbers.size(); j++) { if (numbers[i] + numbers[j] == target) { result[0] = i+1; result[1] = j+1; break; } } } return result; } };
方法二C++:
class Solution { public: vector<int> twoSum(vector<int>& numbers, int target) { vector<int> result(2,-1); if (numbers.size() == 0) return result; map<int, int> hash_map; for (int i = 0; i < numbers.size(); i++) { int another = target - numbers[i]; if (hash_map.count(another) > 0) { result[0] = hash_map[another]+1; result[1] = i + 1; break; } hash_map[numbers[i]] = i; } return result; } };
方法三C++:
class Solution { public: vector<int> twoSum(vector<int>& numbers, int target) { vector<int> result(2,-1); int i = 0; int j = numbers.size() - 1; while (i <= j) { if (numbers[i] + numbers[j] == target) { result[0] = i+1; result[1] = j+1; break; } else if (numbers[i] + numbers[j] < target) i++; else j--; } return result; } };
方法一Java:
class Solution { public int[] twoSum(int[] numbers, int target) { if (numbers == null || numbers.length == 0) return new int[]{-1,-1}; for (int i=0;i<numbers.length;i++) { for (int j=i+1;j<numbers.length;j++) { if (numbers[i]+numbers[j] == target) { return new int[] {i+1,j+1}; } } } return new int[]{-1,-1}; } }
方法二java:
class Solution { public int[] twoSum(int[] numbers, int target) { if (numbers == null || numbers.length == 0) return new int[]{-1,-1}; Map<Integer,Integer> hash_map = new HashMap<>(); for (int i=0;i<numbers.length;i++) { int another = target-numbers[i]; if (hash_map.containsKey(another)) { return new int[]{hash_map.get(another)+1,i+1}; } hash_map.put(numbers[i],i); } return new int[]{-1,-1}; } }
方法三Java:
class Solution { public int[] twoSum(int[] numbers, int target) { if(numbers == null || numbers.length == 0) return new int[]{-1,-1}; int i=0; int j=numbers.length-1; while (i<j) { if(numbers[i] + numbers[j] == target) { return new int[] {i+1,j+1}; } else if(numbers[i] + numbers[j] < target) i++; else j--; } return new int[] {-1,-1}; } }
方法一Python:
from typing import List class Solution: def twoSum(self, numbers: List[int], target: int) -> List[int]: if not numbers :return length=len(numbers) result=[] for i in range(length): for j in range(i+1,length): if numbers[i]+numbers[j] == target: result.append(i+1) result.append(j+1) break return result
方法二Python:
方法三Python:
from typing import List class Solution: def twoSum(self, numbers: List[int], target: int) -> List[int]: if not numbers: return result=[] length=len(numbers) i=0 j=length-1 while i<j: if numbers[i]+numbers[j] == target: result.append(i+1) result.append(j+1) break; elif numbers[i]+numbers[j] < target: i=i+1 else: j=j-1 return result

浙公网安备 33010602011771号