leetcode刷題筆記 二分法

2021-10-23 20:38:12 字數 3335 閱讀 9124

記錄一下,方便複習

leetcode 33

/*

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。

搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1 。

你可以假設陣列中不存在重複的元素。

你的演算法時間複雜度必須是 o(log n) 級別。

示例 1:

輸入: nums = [4,5,6,7,0,1,2], target = 0

輸出: 4

示例 2:

輸入: nums = [4,5,6,7,0,1,2], target = 3

輸出: -1

*//*

要求複雜度o(log n) 可以想到二分法

主要利用分成兩組之後 肯定一邊有序一邊沒有序

*/#include

#include

using

namespace std;

class

solution

if(n ==1)

else

}int left =

0, right = n -1;

while

(left <= right)

if(nums[mid]

>= nums[left]

)else

}else

else}}

return-1

;}};

leetcode 81

和上一題差不多 只不過允許陣列中的元素重複,所以比較的時候如果nums[left] == nums[mid] 讓left++ 相當於把這個去掉了

/*

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [0,0,1,2,2,5,6] 可能變為 [2,5,6,0,0,1,2] )。

編寫乙個函式來判斷給定的目標值是否存在於陣列中。若存在返回 true,否則返回 false。

*//*

可能nums[left]==nums[mid] 所以這時候把left++ 然後在迴圈繼續比較

*/#include

#include

using

namespace std;

class

solution

if(n ==1)

else

}int left =

0, right = n -1;

while

(left <= right)

if(nums[mid]

== nums[left])if

(nums[mid]

> nums[left]

)else

}else

else}}

return

false;}

};

leetcode 153

/*

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。

請找出其中最小的元素。

你可以假設陣列中不存在重複元素。

*//*

考慮到最小值兩邊肯定都比他大,所以直接遍歷就行

也可以用二分法

*/#include

#include

using

namespace std;

class

solution

if(n ==2)

else

}for

(int i =

1; i < n -

1; i++)}

if(nums[0]

< nums[n -1]

)else}}

;

leetcode 154 相比153允許了重複元素

/*

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。

請找出其中最小的元素。

注意陣列中可能存在重複的元素。

示例 1:

輸入: [1,3,5]

輸出: 1

示例 2:

輸入: [2,2,2,0,1]

輸出: 0

*/#include

#include

using

namespace std;

class

solution

if(n ==2)

else

}//二分法做

int left =

0, right = n -1;

if(nums[right]

> nums[left]

)while

(right >= left)

//如果nums[mid]>nums[tmp] 那就證明tmp這個是轉變那個點

if(nums[mid]

> nums[tmp]

)while

(tmp_l > left && nums[mid]

== nums[tmp_l]

)//證明nums[mid]是轉變那個點

if(nums[mid]

< nums[tmp_l]

)//說明全相等

if(nums[mid]

== nums[tmp]

&& nums[mid]

== nums[tmp_l]

)//這裡是要說明左邊是公升序 可能會有10 1 10 10 10這種情況

if(nums[mid]

>= nums[0]

&&nums[tmp_l]

>=nums[0]

)else

}return-1

;}};

//題解

//根據這樣的乙個性質: 我們考慮陣列中的最後乙個元素 xx:

//在最小值右側的元素,它們的值一定都小於等於 xx;

//而在最小值左側的元素,它們的值一定都大於等於 xx。

//因此,我們可以根據這一條性質,通過二分查詢的方法找出最小值

//153題也同樣適用

class

solution

else

if(nums[pivot]

> nums[high]

)else

}return nums[low];}

};

LeetCode刷題之路 二分法

分享巧克力 你有一大塊巧克力,它由一些甜度不完全相同的小塊組成。我們用陣列 sweetness 來表示每一小塊的甜度。你打算和 k 名朋友一起分享這塊巧克力,所以你需要將切割 k 次才能得到 k 1 塊,每一塊都由一些 連續 的小塊組成。為了表現出你的慷慨,你將會吃掉 總甜度最小 的一塊,並將其餘幾...

C 二分法查詢,遞迴二分法

用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...

python二分法查詢 Python 二分法查詢

二分法查詢主要的作用就是查詢元素 lst 1,3,5,7,12,36,68,79 資料集 百萬級資料 num int input 請輸入你要查詢的元素資訊 for el in lst if num el print 存在 break else print 不存在 len lst 0 1 2 3 4 ...