LeetCode刷題筆記(8)二分查詢 分治

2021-10-08 04:52:35 字數 1789 閱讀 7188

今天結束了二分查詢的2個題目,開始了分治的第一道題目,分治的含義就是把複雜問題分解成簡單問題,思路比較難,需要多練習。

解題思路:

關鍵是找到變化點

找到陣列的中間元素 mid。

如果中間元素 > 陣列第乙個元素,我們需要在 mid 右邊搜尋變化點。

如果中間元素 < 陣列第乙個元素,我們需要在 mid 做邊搜尋變化點。

當我們找到變化點時停止搜尋,當以下條件滿足任意乙個即可:

nums[mid] > nums[mid + 1],因此 mid+1 是最小值。

nums[mid - 1] > nums[mid],因此 mid 是最小值。

public

class

findmin153

else

}return nums[left];}

}

總體演算法工作過程與線性掃瞄方法類似,除了找最左和最右下標的方法。

這裡我們僅僅做幾個微小的調整,用這種修改過的二分查詢方法去搜尋這個排過序的陣列。

首先,為了找到最左邊(或者最右邊)包含 target 的下標(而不是找到的話就返回 true ),

另乙個改變是 left 引數的引入,它是乙個 boolean 型別的變數,

指示我們在遇到 target == nums[mid] 時應該做什麼。如果 left 為 true ,

那麼我們遞迴查詢左區間,否則遞迴右區間。考慮如果我們在下標為 i 處遇到了 target ,最左邊的 target 一定不會出現在下標大於 i 的位置,所以我們永遠不需要考慮右子區間。當求最右下標時,道理同樣適用。

class

searchrange34

else

}return lo;

}public int[

]searchrange

(int[

] nums, int target)

; int leftidx =

extremeinsertionindex

(nums, target,

true);

// assert that `leftidx` is within the array bounds and that `target`

// is actually in `nums`.

if(leftidx == nums.length || nums[leftidx]

!= target)

targetrange[0]

= leftidx;

targetrange[1]

=extremeinsertionindex

(nums, target,

false)-

1;return targetrange;

}}

這個方法的思路很好,把問題分步驟表示式新增來進行,首先先找到最左邊的那個元素下標,在以最左邊的下標未left向右尋找。
給定乙個含有數字和運算子的字串,為表示式新增括號,

public

class

diffwaystocompute241}}

}if(ways.

size()

==0)}

return ways;

}}

這道題比較男,首先一次檢測出string中的+-*符號,然後依次計算。啊啊啊啊,好難,心痛,想不到想不到

Leetcode演算法刷題筆記 8二分查詢

leetcode 34.在排序陣列中查詢元素的第乙個和最後乙個位置 尾語相關刷題筆記部落格 競賽常用模板整理 acm icpc ccsp leetcode演算法刷題筆記1 鍊錶 leetcode演算法刷題筆記2 棧 隊 堆 leetcode演算法刷題筆記3 遞迴與回溯 leetcode演算法刷題筆記...

LeetCode刷題筆記 33(涉及二分查詢)

題目 搜尋旋轉排序陣列 假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1 你可以假設陣列中不存在重複的元素。你的演算法時間複雜度必須是 o...

leetcode刷題筆記 二分法

記錄一下,方便複習 leetcode 33 假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1 你可以假設陣列中不存在重複的元素。你的演算法...