[Java][BinarySearch][LeetCode] Search in Rotated Sorted Array II #81

There is an integer array nums sorted in non-decreasing order (not necessarily with distinct values).

Before being passed to your function, nums is rotated at an unknown pivot index k (0 <= k < nums.length) such that the resulting array is [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]] (0-indexed). For example, [0,1,2,4,4,4,5,6,6,7] might be rotated at pivot index 5 and become [4,5,6,6,7,0,1,2,4,4].

Given the array nums after the rotation and an integer target, return true if target is in nums, or false if it is not in nums.

You must decrease the overall operation steps as much as possible.

Example 1:

Input: nums = [2,5,6,0,0,1,2], target = 0
Output: true

This problem can use traverse or binary search. I think traverse is more intuition. Binary search explanations are under:
if nums[mid]=nums[left]: it’s meant, maybe array is include continuity. but we don’t know which zone is. so we need to shift left border and recalculate mid.
if nums[mid]<=nums[right]: it’s meant, right zone is increase order. we can done binary search in this zone.
except as stated above, it’s meant left zone is increase order.
after confirm which zone, we need to scale zone, until left>right.

這題看起來用遍歷或是二分查找做都可以,
遍歷是比較直觀的作法,從頭找到就結束了,
二分查找的部分是,
如果mid的值等於左側的值,則表示可能是連續的相同數,
但無法確定是左邊區間還是右邊區間,
於是把左邊界值右移一位,讓mid重算一次。
假如mid的值小於且等於右邊界的值,
則表示右區間是遞增排序好的序列,否則為左區間是遞增排序好的序列,
先確認是在哪邊的區間之後,
再確認是要縮減左邊界或是右邊界。

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store