[毎日小さなアルゴリズム(83)] [反復] 2つの数値の合計(leetCode問題)

序:私
は最近go言語を学んでいるので、将来的にはjavaとgoの2種類のアルゴリズム問題の解決策を提供します。私はjavaをあきらめるつもりはありません。言語はすべて相互にリンクしています。重要なのはアイデアです。

タイトルの説明

整数配列numsとターゲット値targetを指定して、合計が配列内のターゲット値である2つの整数を見つけ、それらの配列インデックスを返します。

各入力は1つの回答にのみ対応すると想定できます。ただし、この配列で同じ要素を再利用することはできません。


示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

問題解決のアイデア

この問題が時間の複雑さを考慮しない場合、ブルートフォース法を使用してそれを解くことができます各要素xをトラバースし、target-xに等しい値を持つターゲット要素があるかどうかを調べます。そのような時間の複雑さはO(n2)であり、空間の複雑さはO(1)です。この問題を解決するより良い方法はありますか?ハッシュテーブルを使用してこの問題を解決できます。要素を繰り返し処理してハッシュテーブルに挿入するときに、戻って、現在の要素に対応するターゲット要素がハッシュテーブルに既に存在するかどうかを確認します。存在する場合は、対応するソリューションを見つけて、すぐに返します。このようにして、時間の複雑度はO(n)になり、空間の複雑度はO(n)になります。これは、時間と空間を交換することで効率を改善することです。理解できない場合は、コードを見てください。直接理解できます。

コードサンプル

golang

func twoSum(nums []int, target int) []int{
	m := make(map[int]int,10)
	for i,v :=range nums{
		k,ok:=m[target-v]
		if ok{
			return []int{k,i}
		}
		m[v] = i
	}
	return nil
}

java

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map <Integer,Integer> map = new HashMap<>();
        for(int i=0;i<nums.length;i++)
        {
            int tmp=target-nums[i];
            if(map.containsKey(tmp))
            {
                return new int[] {map.get(tmp),i};
            }
            map.put(nums[i],i);
        }
      throw new IllegalArgumentException("No two sum solution");
    }
}
元の記事を197件公開 73 件を賞賛・1 万回以上の閲覧

おすすめ

転載: blog.csdn.net/qq_39397165/article/details/105017761