題目描述
給定一個 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 < right或left <= right作為遍歷的結(jié)束條件
這就決定了left = i + 1和right = 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ù) ===