力扣81、搜尋旋轉排序陣列Ⅱ
阿新 • • 發佈:2021-12-01
1、直接迴圈(4ms,90%;13.5MB,85%)
時間複雜度:O(n):迴圈次數
空間複雜度:O(1)
1 bool search(vector<int>& nums, int target) { 2 if(nums.empty()) 3 return false; 4 int n=0; 5 while(n<nums.size()){ 6 if(target==nums[n]) 7 return true; 8 n++;9 } 10 return false; 11 }
2、二分法(4ms,90%;13.4MB,98%)
時間複雜度:O(n):當所有的陣列元素都相等但和target不相等時需要訪問所有的位置
空間複雜度:O(1)
bool search(vector<int>& nums, int target) { if(nums.empty()) return false; if(nums.size()==1) return nums[0]==target? true:false;int left=0,right=nums.size()-1; int mid=0; while(left<=right){ mid=(left+right)/2; if(nums[mid]==target) return true; //注意不要寫成left==mid&&right==mid //如果三個下標對應的值都相等,無法判斷左邊還是右邊有序 //此時應該收縮範圍,只保留中間的下標 if(nums[left]==nums[mid]&&nums[right]==nums[mid]){ left++; right--; } else if(nums[left]<=nums[mid]){ if(target>=nums[left]&&target<nums[mid]) right=mid-1; else left=mid+1; } else{ if(target>nums[mid]&&target<=nums[right]) left=mid+1; else right=mid-1; } } return false; }