2022-04-28 「167. 兩數(shù)之和 II - 輸入有序數(shù)組」

今日中等題:https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted/

一般這種排序后的題目,就是讓你用二分法或者雙指針,但是壞習(xí)慣是開(kāi)始就想先爆破,所以最開(kāi)始就是暴力法,先雙重遍歷,果然超時(shí)了。

這個(gè)時(shí)候開(kāi)始考慮優(yōu)化算法,二分法的思路是,先找到第一個(gè)數(shù),然后用target減去它,去找第二個(gè)數(shù)。

但是雙指針更簡(jiǎn)單,一次遍歷即可,因?yàn)槭怯行驍?shù)組,從頭尾開(kāi)始找就行:

  1. 和小于target的,說(shuō)明頭小了,要右移;
  2. 和大于target的,說(shuō)明尾大了,要左移;
  3. 和等于target的,恭喜你找到了,返回下標(biāo)就行,但是這里要注意,題目下標(biāo)是從1開(kāi)始,所以還要記得+1;

看下兩種解法:

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        /** 暴力法:全遍歷,O(n*n),超時(shí)了:(
        int head = 0;
        int[] ans = new int[2];
        while (head < numbers.length - 1) {
            for (int tail = head+1; tail < numbers.length; tail++) {
                if (numbers[head] + numbers[tail] == target) {
                    ans[0] = head + 1;
                    ans[1] = tail + 1;
                    return ans;
                }
            }
            head++;
        }
        return ans;
        */

        int head = 0;
        int[] ans = new int[2];
        int tail = numbers.length - 1;
        // 優(yōu)化方案:雙指針,一次遍歷O(n)
        while (head < tail) {
            if (numbers[head] + numbers[tail] == target) {
                ans[0] = head + 1;
                ans[1] = tail + 1;
                return ans;
            }
            else if (numbers[head] + numbers[tail] < target) {
                head++;
            }
            else {
                tail--;
            }
        }
        return ans;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容