Leetcode刷題筆記 查詢

2022-05-07 10:21:08 字數 2423 閱讀 2603

給定乙個被翻轉的整型公升序陣列nums,陣列中無重複元素,如[4,5,6,7,0,1,2],和乙個整數target。要求在被翻轉過的陣列中找到target的位置,若不存在,則返回-1。並且演算法的時間複雜度要求為o(log n)。

如果是有序陣列,則使用二分查詢就可以將複雜度控制在o(log n)了。所以問題集中在找到翻轉中軸,即找到陣列中最小值的位置。但如何在o(log n)的複雜度之下找到最小值的位置呢,這也是我被卡住的地方。

使用二分法查詢最小值的位置,下面是具體實現的**:

public int searchmin(int nums)

return left;

}

這裡有一點和常規的二分法查詢不同,就是當nums[mid]>nums[right]時,left等於mid+1,而當nums[mid]<=nums[right]時,right是等於mid的。這是因為當nums[mid]>nums[right]時,最小值不可能在mid位置,所以左指標可以直接跳到mid+1;但當nums[mid]<=nums[right]時,最小值可能就在mid位置上,所以右指標不能條到mid-1,而是應跳到mid位。

在看了推薦解題演算法的大致思路後自己嘗試寫的時候就是卡在了這一點上。

下面是完整的實現**:

class

solution

int min =searchmin(nums);

if(targetnums[nums.length-1])

return -1;

if(target==nums[0]) return 0;

if(target==nums[nums.length-1]) return nums.length-1;

if(target>nums[0])

else

return

pos;

}/*** 用二分法在公升序或降序陣列中尋找target

* @param

nums

* @param

start

* @param

end *

@param

target

* @return

*/public

int binarysearch(int nums, int start, int end, int

target)

return -1;

}/*** 找出陣列nums中最小值的位置

* @param

nums

* @return

*/public

int searchmin(int

nums)

return

left;

}}

和上題一樣,只是陣列nums中的元素可以重複。

不知道怎麼做,直接看的(能看明白的= =)題解。思路是直接使用改進的二分法查詢。

二分查詢的思想是不斷對半縮小target所處的範圍,但是當陣列被翻轉時,陣列就不是完全有序了,此時要使用二分查詢的話,需要在nums[mid]和target的比較之前明確mid位於翻轉點的左側還是右側。如果mid位於翻轉點的左側,則mid左側的陣列是有序的,可以判斷target是否在nums[start]和nums[mid]之間,若是,則end=mid-1,若非,start=mid+1;若mid位於翻轉點的右側,則mid右側的陣列是完全有序的,此時可以判斷target是否在nums[mid]和nums[end]之間,若是,start=mid+1,若非,end=mid-1。

下面是完整的**:

public

boolean search_2(int nums, int

target)這種情況

while (start<=end && nums[start] == nums[end] && nums[start] ==nums[mid])

if(start>end) return

false

;

//mid在旋轉點左邊

if(nums[mid] >=nums[start])

//mid在旋轉點右邊

else

}return

false

; }

對時間複雜度的推導有一點不是很明白,就是log n的複雜度是怎麼回事。下面這個場景可以幫助理解,可以理解為不斷地取1/2,所以折半查詢演算法的時間複雜度就是o(log n)。

這個問題翻譯一下,就是數字16不斷地除以2,除幾次以後的結果等於1?這裡要涉及到數學當中的對數,以2位底,16的對數,可以簡寫為log16。

因此,把麵包吃得只剩下1寸,需要 5 x log16 = 5 x 4 = 20 天。

如果麵包的長度是 n 寸呢?

需要 5 x logn = 5logn天,記作 t(n) = 5logn。

Leetcode刷題筆記 1002 查詢常用字元

題目 給定僅有小寫字母組成的字串陣列 a,返回列表中的每個字串中都顯示的全部字元 包括重複字元 組成的列表。例如,如果乙個字元在每個字串 現 3 次,但不是 4 次,則需要在最終答案中包含該字元 3 次。你可以按任意順序返回答案。示例1 輸入 bella label roller 輸出 e l l ...

Leetcode刷題筆記

1.兩數之和給定乙個整數陣列nums 和乙個目標值target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。ps 你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。思路 用target減去nums中的每乙個數,並設立乙個字典來記錄對應的下標 class...

LeetCode刷題筆記

實現strstr 給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。示例 1 輸入 haystack hello needle ll 輸出 2 示例 2 輸入 haystack aaaa...