日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Nico的刷题日记(二)

發(fā)布時間:2024/3/12 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Nico的刷题日记(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

35. 搜索插入位置

題目描述

給定一個排序數(shù)組和一個目標值,在數(shù)組中找到目標值,并返回其索引。如果目標值不存在于數(shù)組中,返回它將會被按順序插入的位置。
請必須使用時間復(fù)雜度為 O(log n) 的算法。

思路

官方題解如下:https://leetcode-cn.com/problems/search-insert-position/solution/sou-suo-cha-ru-wei-zhi-by-leetcode-solution/

對于我這種剛開始刷題的人來說,這道題做起來確實讓人頭大!我確實是知道用二分法做,但是考慮到了如果數(shù)組中只有一個元素怎么辦,如果最后遍歷得只剩下兩個元素怎么辦,看了題解后豁然開朗,那么我下面的思路也是按照官方題解進行分析的。

首先給定元素后,我們定義左下標leftIndex和右下標rightIndex,中間元素的下標midIndex根據(jù)左下標leftIndex和右下標rightIndex計算得出(注意不要超過int的范圍)。

int leftIndex = 0; int rightIndex = nums.length - 1; int mid = leftIndex + (rightIndex - leftIndex)/2;

當(dāng)mid的值小于target時,說明我們要找的范圍在mid右側(cè),所以將leftIndex右移一位

if(mid < target){leftIndex = midIndex + 1; }

當(dāng)mid的值大于target時,說明我們要找的范圍在mid左側(cè),所以將rightindex左移一位

if(mid > target){rightIndex = midIndex - 1; }

當(dāng)mid的值等于target時,說明midIndex就是我們要找的數(shù)

if(mid == target){return midIndex; }

我之所以出錯,是因為考慮到最后的target有可能有三種情況:小于nums[leftIndex]、大于nums[leftIndex]小于nums[rightIndex]、大于nums[rightIndex]。需要注意的是,我們比較的是nums[midIndex]和target而不是nums[其他的下標]和target。

然而在我們不斷循環(huán)的過程中(除去mid == target的情況),leftIndex是會和rightIndex重疊的,也就是leftIndex==rightIndex一定會發(fā)生,這種情況下我們再去比較nums[midIndex]和target,要么rightIndex左移,要么leftIndex右移,這樣一定會退出循環(huán),最終leftIndex就是我們要找的值。

為什么leftIndex是我們要找的值?

leftIndex==rightIndex發(fā)生時,再次循環(huán)。

如果rightIndex左移,說明nums[midIndex] > target(注意這個時候midIndex ==leftIndex ==rightIndex),所以target表示的索引位置就是rightIndex+1也就是leftIndex的位置。

如果leftIndex右移,說明nums[midIndex] < target(注意這個時候midIndex ==leftIndex ==rightIndex),所以target表示的索引位置就是rightIndex+1也就是leftIndex的位置。

rightIndex左移和leftIndex右移只是為了退出循環(huán),也可以理解為最終的結(jié)果是rightIndex+1,只不過退出循環(huán)時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;} }

總結(jié)

以上是生活随笔為你收集整理的Nico的刷题日记(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。