溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何編寫兩數(shù)之和的算法代碼

發(fā)布時間:2021-10-09 16:10:07 來源:億速云 閱讀:149 作者:iii 欄目:編程語言

這篇文章主要介紹“如何編寫兩數(shù)之和的算法代碼”,在日常操作中,相信很多人在如何編寫兩數(shù)之和的算法代碼問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何編寫兩數(shù)之和的算法代碼”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

給定一個整數(shù)數(shù)組 nums 和一個整數(shù)目標值 target,請你在該數(shù)組中找出 和為目標值 的那 兩個 整數(shù),并返回它們的數(shù)組下標。

示例:

輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋:因為 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

package com.lau.javabase;

import org.junit.Test;

import java.time.Duration;
import java.time.Instant;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * 時間復雜度排序:
 * O(1)——常數(shù)時間
 * O(logN)——對數(shù)時間
 * O(N)——線性時間
 * O(N*N)——2次指數(shù)時間
 * O(N*N*N)——3次指數(shù)時間
 *
 *給定一個整數(shù)數(shù)組 nums 和一個整數(shù)目標值 target,請你在該數(shù)組中找出 和為目標值 的那 兩個 整數(shù),并返回它們的數(shù)組下標。
 *
 * 你可以假設每種輸入只會對應一個答案。但是,數(shù)組中同一個元素在答案里不能重復出現(xiàn)。
 *
 * 你可以按任意順序返回答案。
 *
 * 來源:力扣(LeetCode)
 * 鏈接:https://leetcode-cn.com/problems/two-sum
 *
 * 測試用例:
 * 輸入:nums = [2,7,11,15], target = 9
 * 輸出:[0,1]
 * 解釋:因為 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
 *
 * 來源:力扣(LeetCode)
 * 鏈接:https://leetcode-cn.com/problems/two-sum
 * 著作權(quán)歸領(lǐng)扣網(wǎng)絡所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
 *
 */
public class TwoSumTest {

    @Test
    public void test(){
        int[] array = {1,5,10,9,12};

        Instant start = Instant.now();
        System.out.println("---------1--------");
        int[]resArray = findTwoIntBySum(array, 17);
        Instant end  = Instant.now();
        long timeElapsed = Duration.between(start, end).toNanos(); // 單位為毫秒
        System.out.println("程序1耗時:" + timeElapsed);
        Arrays.stream(resArray).forEach(System.out :: println);

        start = Instant.now();
        System.out.println("---------2--------");
        int[]resArray2 = findTwoIntBySum2(array, 17);
        end  = Instant.now();
        timeElapsed = Duration.between(start, end).toNanos(); // 單位為毫秒
        System.out.println("程序2耗時:" + timeElapsed);
        Arrays.stream(resArray2).forEach(System.out :: println);

        start = Instant.now();
        System.out.println("---------3--------");
        int[]resArray3 = findTwoIntBySum3(array, 17);
        end  = Instant.now();
        timeElapsed = Duration.between(start, end).toNanos(); // 單位為毫秒
        System.out.println("程序3耗時:" + timeElapsed);
        Arrays.stream(resArray3).forEach(System.out :: println);

        start = Instant.now();
        System.out.println("---------4--------");
        int[]resArray4 = findTwoIntBySum4(array, 17);
        end  = Instant.now();
        timeElapsed = Duration.between(start, end).toNanos(); // 單位為毫秒
        System.out.println("程序4耗時:" + timeElapsed);
        Arrays.stream(resArray4).forEach(System.out :: println);
    }

    /**
     * @Description:解法一,兩層遍歷
     * @param array
     * @param target
     * @return
     */
    private int[] findTwoIntBySum(int[] array, int target){
        int[] resArray = null;

        for(int i = 0; i < array.length - 1; i++){
            for(int j = i + 1; j < array.length; j++){
                if(target == array[i] + array[j]){
                    resArray = new int[]{i, j};
                    return resArray;
                }
            }
        }

        return resArray;
    }

    /**
     * @Description:解法二,依托HashMap,將數(shù)組值作為K,索引作為V存入Map
     * @param array
     * @param target
     * @return
     */
    private int[] findTwoIntBySum2(int[] array, int target){
        int[] resArray = null;

        //建立HashMap,存儲<k,v> K存值,V存索引
        Map<Integer, Integer> midMap = new HashMap<>();
//        Arrays.stream(array).forEach(s -> );

        for(int i = 0; i < array.length; i++){
            midMap.put(array[i], i);
        }

        for(int i = 0; i < array.length; i++){
           if(Objects.nonNull(midMap.get(target - array[i]))){
               resArray = new int[]{i, midMap.get(target - array[i])};
               return resArray;
           }
        }

        return resArray;
    }

    /**
     * @Description:解法三,兩層遍歷(解法一的變種)
     * @param array
     * @param target
     * @return
     */
    private int[] findTwoIntBySum3(int[] array, int target){
        int[] resArray = null;

        for(int i = 0; i < array.length - 1; i++){
            for(int j = i + 1; j < array.length; j++){
                if(target - array[i] == array[j]){
                    resArray = new int[]{i, j};
                    return resArray;
                }
            }
        }

        return resArray;
    }

    /**
     * @Description:解法四,依托HashMap,一次遍歷即可完成
     * @param array
     * @param target
     * @return
     */
    private int[] findTwoIntBySum4(int[] array, int target){
        int[] resArray = null;

        //建立HashMap,存儲<k,v> K存值,V存索引
        Map<Integer, Integer> midMap = new HashMap<>();
//        Arrays.stream(array).forEach(s -> );

        for(int i = 0; i < array.length; i++){
            if(midMap.containsKey(target - array[i])){
                resArray = new int[]{midMap.get(target - array[i]), i};
                return resArray;
            }

            midMap.put(array[i], i);
        }

        return resArray;
    }
}

到此,關(guān)于“如何編寫兩數(shù)之和的算法代碼”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI