整数配列を指定し、2つの数を加算してターゲット値に等しいものを見つけます.

2267 ワード

オリジナル:悦楽書プログラマー小川
整数配列を指定し、2つの数を加算してターゲット値に等しいものを見つけます.
例えば、与えられた配列および目標値nums=[2,7,11,15]、target=9はnums[0]+nums[1]=2+7=9が[0,1]HashMapを利用するため
解法1:
この問題は配列内の任意の2要素の和が与えられた目標整数に等しいことを求め,配列forループが遍歴し,2層forループであることを容易に考え,第1版のコード構想はすでに存在している.
//java    
private int[] findData(int[] array,int target){
   int[] result={-1,-1};
   HashMap map = new HashMap();
   for(int i=0;i
//Kotlin    
fun twoSum1(nums: IntArray, target: Int): IntArray? {
            var result = IntArray(2)
            if (nums.size < 2)
                return null
            for (i in 0..nums.size-1) {
                for (j in i + 1..nums.size-1) {
                    if (nums[i] + nums[j] == target) {
                        result[0] = nums[i]
                        result[1] = nums[j]
                    }
                }
            }
            return result;
        }

解法2:
上の解法は2層の循環で、循環回数はn*(n-1)回で、nは配列要素の個数で、nが大きいほど、プログラムの実行時間が長くなるので、それは1回だけ循環することができますか?加算マッチングができる以上、減算は?ターゲット整数と配列内の各要素の差を取得してから、この差がこの配列に存在するかどうかを判断します.この場合、新しいデータを格納するセットが必要です.各要素と各要素のインデックスが含まれているので、新しいデータを格納するオブジェクトとしてMapを選択します.
 //java  
 public int[] twoSum(int[] nums, int target) {
        Map map = new HashMap();
        int[] result=new int[2];
        for(int i=0;i
//Kotlin  
 fun twoSum2(nums: IntArray, target: Int): IntArray? {
            var result = IntArray(2)
            if (nums.size < 2)
                return null
            var map = HashMap()
            for (i in 0..nums.size-1) {
                val k = target - nums[i]
                if (map.containsKey(k)) {
                    result[0] = nums[map.get(k)!!]
                    result[1] = nums[i]
                    break
                }
                map.put(nums[i], i)
            }
            return result
        }