[leetcode]Two Sum
2615 ワード
水の問題かと思ったら、n^2、n*log(n)からnまで最適化できた.感慨ですね~
O(n^2):暴力
O(n*log(n):並べ替え.O(n)の空間で元の配列を記録し,最後のO(n)のスイープを開始したが,全体的な複雑さは変化しなかった.もちろんデータ構造で元と後のつながりを記録する人もいますが、それは別のO(n)の空間省が最後にスキャンしただけです.問題を解く過程で最初は元の配列を記録するのを忘れていたが、後にソートを忘れた第1、第2、ソート後も異なる可能性がある.
O(n):やっぱりハシュを使っているのは不思議ではありません.したがって,実際の複雑さはHashの実現を考慮するとO(n)よりも大きくなる.
O(n^2):暴力
public class Solution {
public int[] twoSum(int[] numbers, int target) {
// Start typing your Java solution below
// DO NOT write main() function
int[] r = new int[2];
for (int i = 0; i < numbers.length; i++)
{
for (int j = i+1; j < numbers.length; j++)
{
if (numbers[i] + numbers[j] == target)
{
r[0] = i+1;
r[1] = j+1;
break;
}
}
}
return r;
}
}
O(n*log(n):並べ替え.O(n)の空間で元の配列を記録し,最後のO(n)のスイープを開始したが,全体的な複雑さは変化しなかった.もちろんデータ構造で元と後のつながりを記録する人もいますが、それは別のO(n)の空間省が最後にスキャンしただけです.問題を解く過程で最初は元の配列を記録するのを忘れていたが、後にソートを忘れた第1、第2、ソート後も異なる可能性がある.
import java.util.Arrays;
public class Solution {
public int[] twoSum(int[] numbers, int target) {
// Start typing your Java solution below
// DO NOT write main() function
int[] result = new int[2];
int[] tmp = new int[numbers.length];
for (int i = 0; i < numbers.length; i++)
{
tmp[i] = numbers[i];
}
Arrays.sort(tmp);
int l = 0;
int r = tmp.length - 1;
int sum = tmp[l] + tmp[r];
while( sum != target && r > l)
{
if (sum > target)
{
r--;
}
else
{
l++;
}
sum = tmp[l] + tmp[r];
}
int index = 0;
for (int i = 0; i < numbers.length; i++)
{
if (tmp[l] == numbers[i] || tmp[r] == numbers[i])
{
result[index] = i + 1;
index++;
if (index > 1) break;
}
}
return result;
}
}
O(n):やっぱりハシュを使っているのは不思議ではありません.したがって,実際の複雑さはHashの実現を考慮するとO(n)よりも大きくなる.
import java.util.HashMap;
public class Solution {
public int[] twoSum(int[] numbers, int target) {
// Start typing your Java solution below
// DO NOT write main() function
int[] result = new int[2];
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < numbers.length; i++)
{
if (map.containsKey(target - numbers[i]))
{
result[0] = map.get(target-numbers[i]) + 1;
result[1] = i + 1;
break;
}
else
{
map.put(numbers[i], i);
}
}
return result;
}
}