1. 題目
2. 解答
2.1. 方法一
基于 LeetCode 33——搜索旋轉(zhuǎn)排序數(shù)組 中的方法二。
當(dāng) nums[mid] = nums[right] 時呕缭,比如 [1, 1, 2, 1, 1]堵泽,[1, 1, 0, 1, 1],為了找到正確的轉(zhuǎn)折點(diǎn)恢总,我們查看 [mid, right] 之間有沒有不等于 nums[mid] 的值迎罗,若有,則繼續(xù)向右查找片仿;否則向左查找纹安。
class Solution {
public:
int Binary_Search(vector<int>& nums, int left, int right, int target)
{
int mid = 0;
while(left <= right)
{
mid = left + (right - left) / 2;
if (nums[mid] == target)
{
return mid;
}
else if(nums[mid] < target)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return -1;
}
bool search(vector<int>& nums, int target) {
if (nums.size() == 0) return 0; // 數(shù)組為空
int left = 0;
int right = nums.size() - 1;
int mid = 0;
while(left < right)
{
mid = left + (right - left) / 2;
if (nums[mid] > nums[right])
{
left = mid + 1;
}
else if (nums[mid] < nums[right])
{
right = mid;
}
else // nums[mid] = nums[right]
{
int flag = 1;
for (int i = mid; i < right; i++)
{
int temp = nums[mid];
if (nums[i] != temp) // mid 到 right 之間有不等于 nums[mid] 的值,向右邊查找
{
flag= 0;
left = mid + 1;
break;
}
}
if (flag)
{
right = mid; // mid 到 right 之間沒有小于 nums[mid] 的值砂豌,向左邊查找
}
}
}
int a = Binary_Search(nums, 0, right-1, target);
int b = Binary_Search(nums, right, nums.size() - 1, target);
return a == -1 && b == -1 ? false : true;
}
};
2.2. 方法二
基于 LeetCode 33——搜索旋轉(zhuǎn)排序數(shù)組 中的方法三厢岂。
當(dāng) nums[mid] = nums[right] 時,比如 [1, 1, 2, 1, 1]阳距,[1, 1, 0, 1, 1]塔粒,我們直接將右邊界 right 減一,然后繼續(xù)查找筐摘。
class Solution {
public:
bool search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
int mid = 0;
while(left <= right)
{
mid = left + (right - left) / 2;
if (nums[mid] == target)
{
return true;
}
else if (nums[mid] < nums[right]) // nums[mid] 在右邊升序的數(shù)據(jù)區(qū)間內(nèi)
{
if (nums[mid] < target && target <= nums[right]) left = mid + 1;
else right = mid - 1;
}
else if (nums[mid] > nums[right]) // nums[mid] 在左邊升序的數(shù)據(jù)區(qū)間內(nèi)
{
if (nums[left] <= target && target < nums[mid]) right = mid - 1;
else left = mid + 1;
}
else // nums[mid] = nums[right]
{
right--;
}
}
return false;
}
};
獲取更多精彩卒茬,請關(guān)注「seniusen」!