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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP、mysql面试题 (附答案+实现
- 下一篇: C#.NET根据数据库中0,1返回对应代