Nico的刷题日记(二)
35. 搜索插入位置
題目描述
給定一個排序數組和一個目標值,在數組中找到目標值,并返回其索引。如果目標值不存在于數組中,返回它將會被按順序插入的位置。
請必須使用時間復雜度為 O(log n) 的算法。
思路
官方題解如下:https://leetcode-cn.com/problems/search-insert-position/solution/sou-suo-cha-ru-wei-zhi-by-leetcode-solution/
對于我這種剛開始刷題的人來說,這道題做起來確實讓人頭大!我確實是知道用二分法做,但是考慮到了如果數組中只有一個元素怎么辦,如果最后遍歷得只剩下兩個元素怎么辦,看了題解后豁然開朗,那么我下面的思路也是按照官方題解進行分析的。
首先給定元素后,我們定義左下標leftIndex和右下標rightIndex,中間元素的下標midIndex根據左下標leftIndex和右下標rightIndex計算得出(注意不要超過int的范圍)。
int leftIndex = 0; int rightIndex = nums.length - 1; int mid = leftIndex + (rightIndex - leftIndex)/2;當mid的值小于target時,說明我們要找的范圍在mid右側,所以將leftIndex右移一位
if(mid < target){leftIndex = midIndex + 1; }當mid的值大于target時,說明我們要找的范圍在mid左側,所以將rightindex左移一位
if(mid > target){rightIndex = midIndex - 1; }當mid的值等于target時,說明midIndex就是我們要找的數
if(mid == target){return midIndex; }我之所以出錯,是因為考慮到最后的target有可能有三種情況:小于nums[leftIndex]、大于nums[leftIndex]小于nums[rightIndex]、大于nums[rightIndex]。需要注意的是,我們比較的是nums[midIndex]和target而不是nums[其他的下標]和target。
然而在我們不斷循環的過程中(除去mid == target的情況),leftIndex是會和rightIndex重疊的,也就是leftIndex==rightIndex一定會發生,這種情況下我們再去比較nums[midIndex]和target,要么rightIndex左移,要么leftIndex右移,這樣一定會退出循環,最終leftIndex就是我們要找的值。
為什么leftIndex是我們要找的值?
leftIndex==rightIndex發生時,再次循環。
如果rightIndex左移,說明nums[midIndex] > target(注意這個時候midIndex ==leftIndex ==rightIndex),所以target表示的索引位置就是rightIndex+1也就是leftIndex的位置。
如果leftIndex右移,說明nums[midIndex] < target(注意這個時候midIndex ==leftIndex ==rightIndex),所以target表示的索引位置就是rightIndex+1也就是leftIndex的位置。
rightIndex左移和leftIndex右移只是為了退出循環,也可以理解為最終的結果是rightIndex+1,只不過退出循環時leftIndex=rightIndex+1。
代碼
class Solution {public int searchInsert(int[] nums, int target) {int leftIndex = 0;int rightIndex = nums.length - 1;while(leftIndex <= rightIndex ){int midIndex = leftIndex + (rightIndex - leftIndex)/2;if(nums[midIndex] == target){return midIndex;}else if(nums[midIndex] > target){rightIndex = midIndex - 1;}else {leftIndex = midIndex + 1;}}return leftIndex;} }總結
以上是生活随笔為你收集整理的Nico的刷题日记(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 轻生男子受的哥劝慰3小时 为求死刑将其杀
- 下一篇: 为什么安卓手机退出大型游戏时没有过渡动画