LeetCode 81——搜尋旋轉排序陣列 II
1. 題目
2. 解答
2.1. 方法一
基於 LeetCode 33——搜尋旋轉排序陣列 中的方法二。
當 nums[mid] = nums[right] 時,比如 [1, 1, 2, 1, 1],[1, 1, 0, 1, 1],為了找到正確的轉折點,我們檢視 [mid, right] 之間有沒有不等於 nums[mid] 的值,若有,則繼續向右查詢;否則向左查詢。
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; // 陣列為空
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——搜尋旋轉排序陣列 中的方法三。
當 nums[mid] = nums[right] 時,比如 [1, 1, 2, 1, 1],[1, 1, 0, 1, 1],我們直接將右邊界 right 減一,然後繼續查詢。
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] 在右邊升序的資料區間內
{
if (nums[mid] < target && target <= nums[right]) left = mid + 1;
else right = mid - 1;
}
else if (nums[mid] > nums[right]) // nums[mid] 在左邊升序的資料區間內
{
if (nums[left] <= target && target < nums[mid]) right = mid - 1;
else left = mid + 1;
}
else // nums[mid] = nums[right]
{
right--;
}
}
return false;
}
};
獲取更多精彩,請關注「seniusen」!
相關文章
- 力扣-81. 搜尋旋轉排序陣列 II力扣排序陣列
- LeetCode 33——搜尋旋轉排序陣列LeetCode排序陣列
- LeetCode33. 搜尋旋轉排序陣列LeetCode排序陣列
- LeetCode#33搜尋旋轉排序陣列LeetCode排序陣列
- LeetCode33 搜尋旋轉排序陣列LeetCode排序陣列
- 【LeetCode(Java) - 33】搜尋旋轉排序陣列LeetCodeJava排序陣列
- leetCode33搜尋旋轉排序陣列LeetCode排序陣列
- leetcode, LC68:旋轉排序陣列搜尋LeetCode排序陣列
- 力扣·33. 搜尋旋轉排序陣列力扣排序陣列
- LeetCode 熱題 HOT 100 Java題解——33. 搜尋旋轉排序陣列LeetCodeJava排序陣列
- LeetCode-153-尋找旋轉排序陣列中的最小值LeetCode排序陣列
- 【LeetCode】153. 尋找旋轉排序陣列中的最小值LeetCode排序陣列
- LeetCode 189 旋轉陣列LeetCode陣列
- 【LeetCode】189. 旋轉陣列LeetCode陣列
- LeetCode-189-旋轉陣列LeetCode陣列
- LeetCode 刷題 [C++] 第33題. 搜尋旋轉排序陣列 (二分法+簡潔易懂)LeetCodeC++排序陣列
- LeetCodeHot100 二分查詢 35. 搜尋插入位置 74. 搜尋二維矩陣 34. 在排序陣列中查詢元素的第一個和最後一個位置 33. 搜尋旋轉排序陣列 153. 尋找旋轉排序陣列中的最小值LeetCode矩陣排序陣列
- 153. 尋找旋轉排序陣列中的最小值排序陣列
- 33、搜尋旋轉排序陣列 | 演算法(leetode,附思維導圖 + 全部解法)300題排序陣列演算法
- 153. 尋找旋轉排序陣列中的最小值(中)排序陣列
- LeetCode每日一題: 旋轉陣列(No.189)LeetCode每日一題陣列
- LeetCode每日一題: 按奇偶排序陣列 II(No.27)LeetCode每日一題排序陣列
- LeetCode將有序陣列轉化為二叉搜尋樹--JavaLeetCode陣列Java
- LeetCode 108. 將有序陣列轉換為二叉搜尋樹LeetCode陣列
- LeetCode-108-將有序陣列轉換為二叉搜尋樹LeetCode陣列
- leetcode 108.將有序陣列轉換為二叉搜尋樹 JavaLeetCode陣列Java
- LeetCodeHot100 73. 矩陣置零 54. 螺旋矩陣 48. 旋轉影像 240. 搜尋二維矩陣 IILeetCode矩陣
- Leetcode每日一題:992.sort-array-by-parity-ii(按奇偶排序陣列Ⅱ)LeetCode每日一題排序陣列
- 240. 搜尋二維矩陣 II 和74. 搜尋二維矩陣矩陣
- PHP 陣列搜尋 sdk & 陣列分頁PHP陣列
- LC 189. 旋轉陣列陣列
- 922. 按奇偶排序陣列 II (java)排序陣列Java
- LeetCode 74——搜尋二維矩陣LeetCode矩陣
- 旋轉陣列中的最小元素陣列
- LeetCode-350-兩個陣列的交集 IILeetCode陣列
- [leetCode]95. 不同的二叉搜尋樹 IILeetCode
- LeetCode-095-不同的二叉搜尋樹 IILeetCode
- 【LeetCode】905.按奇偶排序陣列LeetCode排序陣列