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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

81. Search in Rotated Sorted Array II

發布時間:2025/3/17 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 81. Search in Rotated Sorted Array II 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:

Follow up for "Search in Rotated Sorted Array":
What if?duplicates?are allowed?

Would this affect the run-time complexity? How and why?

Write a function to determine if a given target is in the array.

鏈接: ?http://leetcode.com/problems/search-in-rotated-sorted-array-ii/

題解:

平移過的數組查找數字。依然是使用二分查找,不過有了duplicate所以判斷的條件更多更復雜。

Time Complexity - O(n), Space Complexity - O(1)。

public class Solution {public boolean search(int[] nums, int target) {if(nums == null || nums.length == 0)return false;int lo = 0, hi = nums.length - 1;while(lo <= hi) {int mid = lo + (hi - lo) / 2;if(target < nums[mid]) {if(nums[mid] < nums[hi]) { // right half sortedhi = mid - 1;} else if(nums[mid] > nums[hi]) { //left half sorted if(target < nums[lo]) {lo = mid + 1; //target at right half} else {hi = mid - 1; //target at left half }} else { // nums[mid] == nums[hi], cannot tellhi--;}} else if (target > nums[mid]) {if(nums[lo] < nums[mid]) { //left half sortedlo = mid + 1;} else if(nums[lo] > nums[mid]) { // right half sortedif(target > nums[hi])hi = mid - 1; //target at left halfelselo = mid + 1; //target at right half} else { // nums[mid] == nums[hi], cannot telllo++;}} else // nums[mid] == target, foundreturn true;}return false;} }

?

二刷:

還是使用二分法來完成搜索。這里不同的地方是,假如nums[mid]等于一個端點的時候,假如是左端點,那么我們不能判斷出哪一邊是排序的,只能lo++。否則,我們可以通過比較判斷出左邊或者右邊是排序的,從而使用二分查找。

Java:

Time Complextiy - O(n), Space Complexity - O(1)

public class Solution {public boolean search(int[] nums, int target) {if (nums == null || nums.length == 0) {return false;}int lo = 0, hi = nums.length - 1;while (lo <= hi) {int mid = lo + (hi - lo) / 2;if (nums[mid] == target) {return true;}if (nums[lo] < nums[mid]) {if (nums[lo] <= target && target < nums[mid]) {hi = mid - 1; } else {lo = mid + 1;}} else if (nums[lo] > nums[mid]) {if (nums[mid] < target && target <= nums[hi]) {lo = mid + 1;} else {hi = mid - 1;}} else {lo++;}}return false;} }

?

2/6/2016

題外話:

國內今天已經是29號,除夕了。現在我一個人在美帝的家里,中午剛上完課,下午也參加了一個tech talk。依然是平實的一天,就是覺得有點蛋疼, 該春節回家陪陪爸媽的。 我打算明天給自己放假一天,好好看會電視,然后去H-Mart買桶炸雞吃掉。

?

三刷:

其實29號那天并沒有吃炸雞。

?

注意比較的都是nums[lo]和nums[mid]。我們在比較晚nums[lo]和nums[mid]之后, 再假定一邊有序,一邊無序的情況。假如nums[lo] == nums[lo],我們不能二分,只能增加lo來繼續下一次判斷。

Java:

public class Solution {public boolean search(int[] nums, int target) {if (nums == null || nums.length == 0) return false;int lo = 0, hi = nums.length - 1;while (lo <= hi) {int mid = lo + (hi - lo) / 2;if (nums[mid] == target) return true;if (nums[lo] < nums[mid]) {if (target >= nums[lo] && target < nums[mid]) hi = mid - 1;else lo = mid + 1;} else if (nums[lo] > nums[mid]) {if (target > nums[mid] && target <= nums[hi]) lo = mid + 1;else hi = mid - 1;} else {lo++;}}return false;} }

?

?

Reference:

https://leetcode.com/discuss/223/when-there-are-duplicates-the-worst-case-is-could-we-do-better

總結

以上是生活随笔為你收集整理的81. Search in Rotated Sorted Array II的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。