LeetCode1。二つの数字と
整数配列NUMSと目標値目標を与え、そして配列内の二つの整数の目標値を特定し、その配列の添字に戻るにお願いします。
あなたは、各入力が一つだけ答えに対応することを想定することができます。ただし、同じ配列要素を再使用することはできません。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
1思考:
暴力トラバーサル、ダブルループ、Oの時間複雑度(N ^ 2);
考え2:
HashMapのストアドバリュー法、時間複雑度は、O(N)であり、
コード:
public class Twosum {
public int[] twoSum(int[] nums, int target) {
int length = nums.length;
int[] result = new int[2];
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < length; i++) {
if (map.containsKey(target - nums[i])) {
result[0] = map.get(target - nums[i]);
result[1] = i;
return result;
}
map.put(nums[i], i);
}
return result;
}
}
LeetCode15 3つの数及び
N NUMSを含む整数の配列を指定は、三つの要素は、C NUMSよう+ B + C = 0、Bが存在するか否かを判断しますか?すべての条件が重複したトリプルを見つけることは満足していません。
注意:答えは重複したトリプルを含めることはできません。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
トリプルに設定された要件を満たしています。
[
[-1, 0, 1],
[-1, -1, 2]
]
1思考:
暴力検索は O(N ^ 3)時間計算、動的に効率を最適化するために二重ポインタ無効溶液によって除去してもよいです。
2考える:
HashMapの価値保存方法:
:3考え
ダブルフィンガーアイデア:最初の所定のソートNUMSを、複雑さはO(NlogN)です。左端の3つのポインタを固定する(最小の)数のポインタk、Iダブルポインタ、配列インデックス(K、LEN(NUMS))に位置jが、交互にそれぞれ固定されたkについて中間レコードポインタに二重ポインタが移動端すべて満たすNUMS [K] + NUMS [I ] + NUMS [J] == 0 、組み合わせでJ iは:
場合NUMS [K]> 0直接ブレークアウト:以来NUMS [J]> = NUMS [I]> = NUMS [K]> 0、すなわち、インデックスkは、固定を見つけることは不可能であるから3桁000、より大きい結果。
ときK> 0とNUMS [K] == NUMS [K - 1]この要素をスキップする、すなわちNUMS [K]:既にNUMS [K - 1]の結果の全ての組み合わせに加え、このサーチポインタビスそれが唯一の繰り返しの組み合わせを取得します。
iがjは周期S =のNUMS [K] + NUMS [I] + NUMS [J]、デュアルポインタの動きを計算し、次のルールを実行する<とき、私は、Jは、(K、lenの(NUMS))が終了配列インデックスに位置しています:
場合S <0時間、I + = 1と重複するNUMSをスキップ[i]は、
もしS> 0、J - = 1と重複するNUMS [j]をスキップし、
S == 0、記録組成RESに[K、I、J]、及びI + = 1 J行わ- = 1と組み合わせて繰り返し記録を防止するために、任意の重複NUMS [i]とNUMS [j]を、スキップします。
複雑性分析:
O(N ^ 2)ここで、kは、固定ポインタ循環的複雑度をO(N)であり、二重ポインタI Oの、j個の複雑さ(N)の時間複雑。
宇宙複雑さO(1)追加のスペースポインタ一定のサイズ。
コード:
public class Sumthree15 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int[] nums = { -2, 0, 1, 1, 2 };
Sumthree15 test = new Sumthree15();
System.out.println(test.threeSum(nums));
}
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> result = new ArrayList<List<Integer>>();
for (int k = 0; k < nums.length - 2; k++) {
if (nums[k] > 0) {
break;
}
int i = k + 1;
if (k > 0 && nums[k] == nums[k - 1]) {
continue;
}
int j = nums.length - 1;
int s = nums[k] + nums[i] + nums[j];
while (i < j) {
if (s < 0) {
i++;
while (i < j && nums[i] == nums[i - 1]) {
i++;
}
s = nums[k] + nums[i] + nums[j];
} else if (s > 0) {
j--;
while (i < j && nums[j] == nums[j + 1]) {
j--;
}
s = nums[k] + nums[i] + nums[j];
} else {
List<Integer> now = new ArrayList<Integer>();
now.add(nums[k]);
now.add(nums[i]);
now.add(nums[j]);
result.add(now);
i++;
j--;
while (i < j && nums[i] == nums[i - 1]) {
i++;
}
while (i < j && nums[j] == nums[j + 1]) {
j--;
}
s = nums[k] + nums[i] + nums[j];
}
}
}
return result;
}
}