双重循环、桶排序、HashMap
题目链接:两数之和
1.双重循环,最基本的方法,速度慢O(n^2),但无需新空间。public int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
int temp = target - nums[i];
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] == temp) {
int[] res = {i, j};
return res;
}
}
}
return null;
}
2.桶排序法,速度快O(n),但空间不确定性太大O(?)。
public int[] twoSum(int[] nums, int target) {
int i = 0, len = nums.length;
int max = nums[0];
int min = nums[0];
for (i = 1; i < len; i++) {
if (nums[i] > max) max = nums[i];
if (nums[i] < min) min = nums[i];
}
int temp = min;
if (target - max < min) min = target - max;
if (target - temp > max) max = target - temp;
int[] mark = new int[max - min + 1 + 1];
int offset = 0 - min;
for (i = 0; i < len; i++) {
mark[nums[i] + offset] = i + 1;
}
for (i = 0; i < len; i++) {
int index = mark[target - nums[i] + offset] - 1;
if (index != -1 && index != i) {
int[] res = {i, index};
return res;
}
}
return null;
}
3.hash法,利用hash表中查询比线性查询快的特点O(n),且所需空间可以确定O(n)。
Java中HashMap底层实现即为HashMap,故此处使用HashMap。
public int[] twoSum(int[] nums, int target) {
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
Integer temp = map.get(target - nums[i]);
if (temp != null && temp != i) {
int[] res = {i, temp};
return res;
}
}
return null;
}