日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode 33 搜索旋转排序数组 到处是细节的好题

發布時間:2023/12/13 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode 33 搜索旋转排序数组 到处是细节的好题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這個題想了想就會做,只是細節真的能卡死人,找了好久的bug。甚至我懷疑我現在的代碼可能還有錯,只是沒例子測出來。

假設按照升序排序的數組在預先未知的某個點上進行了旋轉。

( 例如,數組?[0,1,2,4,5,6,7]?可能變為?[4,5,6,7,0,1,2]?)。

搜索一個給定的目標值,如果數組中存在這個目標值,則返回它的索引,否則返回?-1?。

你可以假設數組中不存在重復的元素。

你的算法時間復雜度必須是?O(log?n) 級別。

示例 1:

輸入: nums = [4,5,6,7,0,1,2], target = 0
輸出: 4
示例?2:

輸入: nums = [4,5,6,7,0,1,2], target = 3
輸出: -1

思路:先二分找到旋轉點,然后確定在旋轉點左邊查還是右邊查,再二分查找目標。

需要注意的細節在代碼中標注

class Solution {public int search(int[] nums, int target) {if(nums.length==0)return -1;//坑1if(nums.length==1){//坑2if(nums[0]==target)return 0;return -1;}int left=0;int right=nums.length-1;int index=nums.length-1;//旋轉邊界,坑3,初始化別的值是錯的//確定旋轉邊界while(left<=right){int mid=(right-left)/2+left;if (mid==nums.length-1 || nums[mid] > nums[mid + 1]){//坑4,不加第一個條件會越界index = mid+1;break;}else if(nums[left]<=nums[mid]){//坑5,記得加=left=mid+1;}else{right=mid-1;}}//確定在哪邊二分查找if(target>=nums[0]){//坑6,記得加等于left=0;right=index-1;}else{left=index;right=nums.length-1;}//查找while(left<=right){//坑7,mid直接(right+left)/2可能超過int范圍int mid=(right-left)/2+left;if(nums[mid]<target){left=mid+1;}else if(nums[mid]>target){right=mid-1;}else{return mid;}}return -1;} }

?

總結

以上是生活随笔為你收集整理的leetcode 33 搜索旋转排序数组 到处是细节的好题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。