算法 2.4.1 二分查找【leetcode 704】

題目描述

給定一個 n 個元素有序的(升序)整型數(shù)組 nums 和一個目標值 target ,寫一個函數(shù)搜索 nums 中的 target,如果目標值存在返回下標,否則返回 -1。

示例 1:
輸入: nums = [-1,0,3,5,9,12], target = 9
輸出: 4
解釋: 9 出現(xiàn)在 nums 中并且下標為 4

示例 2:
輸入: nums = [-1,0,3,5,9,12], target = 2
輸出: -1
解釋: 2 不存在 nums 中因此返回 -1

提示:
你可以假設(shè) nums 中的所有元素是不重復(fù)的。
n 將在 [1, 10000]之間。
nums 的每個元素都將在 [-9999, 9999]之間。

數(shù)據(jù)結(jié)構(gòu)

  • 數(shù)組

算法思維

  • 遍歷、二分查找
解題要點
  • 數(shù)組下標的控制(明確是否會越界)

解題思路


一. Comprehend 理解題意

=== 略 ===

二. Choose 選擇數(shù)據(jù)結(jié)構(gòu)與算法
細節(jié)問題:數(shù)組下標越界
  • 二分查找時,以 left < rightleft <= right 作為遍歷的結(jié)束條件
    這就決定了 left = i + 1right = i -1 的操作不會出現(xiàn)數(shù)組越界異常
    這是因為如果下標 i 已經(jīng)處于數(shù)組邊界位置,則 left 的右移或 right 的左移會使 left > right,不會進入下次循環(huán)
三. Code 編碼實現(xiàn)基本解法
class Solution {
    public int search(int[] nums, int target) {

        int len = nums.length;
        int i = 0; //當前元素索引

        //1.定義兩個指針,指明查找范圍
        int left = 0;
        int right = len - 1;

        //2.二分查找當前數(shù)組
        while (left <= right) {
            i = (left + right) / 2;
            if (nums[i] > target) right = i - 1;
            else if (nums[i] < target) left = i + 1;
            else return i;
        }

        //3.left>right 即為不包含 target
        return -1;
    }
}

執(zhí)行耗時:0 ms,擊敗了 100.00% 的Java用戶
內(nèi)存消耗:39.2 MB,擊敗了 81.54% 的Java用戶

時間復(fù)雜度:O(n)
? ? 原數(shù)組遍歷 O(n)

空間復(fù)雜度:O(1)
? ? 兩個整型變量,常數(shù)級內(nèi)存空間 O(1)

四. Consider 思考更優(yōu)解

=== 待續(xù) ===

五. Code 編碼實現(xiàn)最優(yōu)解

=== 待續(xù) ===

六. Change 變形與延伸

=== 待續(xù) ===

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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