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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

Nico的刷题日记(二)

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

35. 搜索插入位置

題目描述

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

思路

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

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

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

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

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

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

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

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

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

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

我之所以出錯(cuò),是因?yàn)榭紤]到最后的target有可能有三種情況:小于nums[leftIndex]、大于nums[leftIndex]小于nums[rightIndex]、大于nums[rightIndex]。需要注意的是,我們比較的是nums[midIndex]和target而不是nums[其他的下標(biāo)]和target。

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

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

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

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

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

rightIndex左移和leftIndex右移只是為了退出循環(huán),也可以理解為最終的結(jié)果是rightIndex+1,只不過(guò)退出循環(huán)時(shí)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的刷题日记(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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