LeetCode最初の質問の
主題の説明:整数配列NUMSと目標値の目標を考えると、配列内の二つの整数の目標値を特定し、その配列の添字に戻るにお願いします。
あなたは、各入力が一つだけ答えに対応することを想定することができます。ただし、同じ配列要素を再使用することはできません。
ソリューション
- ブルートフォース(アレイ、Oの時間複雑さを横切ります O(1)の)、空間的複雑。
public static 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[j]==target-nums[i]){
return new int[]{i,j};
}
}
}
return null;
}
- 二回ハッシュテーブル:最初に報告されたキーと値のハッシュマップに入れ、その後、配列による。O(N)、O(N)の空間的な複雑さの時間複雑。
public static int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> map = new HashMap();
for(int i= 0;i<nums.length;++i)
{
map.put(nums[i],i);
}
for(int i=0;i<nums.length;++i){
if(map.containsKey(target-nums[i])&&map.get(target - nums[i])!=i){
return new int[]{i,map.get(target-nums[i])};
}
}
return null;
}
- 再びハッシュ:側は、キーと値、サイド裁判官を置きます。O(N)、O(N)の空間的な複雑さの時間複雑。
穴は、第一置く場合鍵ハッシュマップが決定その後、同じ値ではない、がある、同じ2つの数字との出会いは、目標に等しい(例えば:[3,3]、ターゲット:6 )、 なぜならプットバックカバーの値私は正しい結果を得ることができないので、値は、目の前に置きます。
次のようにエラーコードがあります:
public static int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> map = new HashMap();
for(int i= 0;i<nums.length;++i)
{
map.put(nums[i],i);
if(map.containsKey(target - nums[i]) && map.get(target -nums[i])!=i){
return new int[]{i,map.get(target - nums[i])};
}
}
return null;
}
正しいコード:
public static int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> map = new HashMap();
for(int i= 0;i<nums.length;++i)
{
if(map.containsKey(target - nums[i])){
return new int[]{i,map.get(target - nums[i])};
}
map.put(nums[i],i);
}
return null;
}