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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

in the java search_LeetCode第[33]题(Java):Search in Rotated Sorted Array

發(fā)布時間:2025/3/21 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 in the java search_LeetCode第[33]题(Java):Search in Rotated Sorted Array 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目:在翻轉(zhuǎn)有序中搜索

難度:Medium

題目內(nèi)容:

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e.,?[0,1,2,4,5,6,7]?might become?[4,5,6,7,0,1,2]).

You are given a target value to search. If found in the array return its index, otherwise return?-1.

You may assume no duplicate exists in the array.

Your algorithm's runtime complexity must be in the order of?O(log?n).

翻譯:

假設(shè)一個按升序排序的數(shù)組在事先不知道旋轉(zhuǎn)點的情況下翻轉(zhuǎn)。

(即。0,1,2,4,5,6,7可能變成4,5,6,7,0,1,2)。

您獲得了搜索的目標(biāo)值。如果在數(shù)組中找不到它的索引,否則返回-1。

數(shù)組中不存在重復(fù)。

您的算法的運(yùn)行時復(fù)雜度應(yīng)該為O(log n)

我的思路:要復(fù)雜度O(log n),但是數(shù)組只是基本有序,而排序算法的最佳情況也要O(N),本弱雞想不出什么很好方法。。。

那就強(qiáng)行上吧,先插入排序一波,再二分法搜索。

然而最后要返回下標(biāo),再排序后下標(biāo)會發(fā)生變化,所以再新建一個數(shù)組存儲下標(biāo),在排序過程中,此數(shù)組相應(yīng)的值跟著一起移動。

MyCode:

1 public int search(int[] nums, inttarget) {2 int[] index = new int[nums.length];3 for (int i = 0; i < nums.length; i++) {4 index[i] =i;5 }6 insertSort(nums, index);7 returnbinaryFind(nums, target, index);8 }9

10 static int binaryFind(int[] nums, int target, int[] index) {11 int low = 0;12 int high = nums.length - 1;13 while (low <=high) {14 int mid = low + (high - low)/2;15 if (nums[mid] ==target) {16 returnindex[mid];17 } else if (nums[mid] >target) {18 high = mid - 1;19 } else{20 low = mid + 1;21 }22 }23 return -1;24 }25

26 static void insertSort(int[] nums, int[] index) {27 for (int i = 1; i < nums.length; i++) {28 int temp =nums[i];29 int temp2 =index[i];30 int j = i - 1;31 while (j > -1 && nums[j] >temp) {32 nums[j+1] =nums[j];33 index[j+1] =index[j];34 j--;35 }36 nums[j+1] =temp;37 index[j+1] =temp2;38 }39 }

我的算法復(fù)雜度:O(N2),因為插入排序的最壞情況就是O(N2)。

編碼過程中出現(xiàn)的問題:

1、把插入排序的邏輯給忘了。。

答案代碼:

1 public int search(int[] A, inttarget) {2 int n =A.length;3 int lo=0,hi=n-1;4 while(loA[hi]) lo=mid+1;7 else hi=mid;8 }9 int rot=lo;10 lo=0;hi=n-1;11 while(lo<=hi){12 int mid=(lo+hi)/2;13 int realmid=(mid+rot)%n;14 if(A[realmid]==target)returnrealmid;15 if(A[realmid]

答案復(fù)雜度:O(logN)

答案思路:首先利用數(shù)組局部仍然有序的特點,和?A[mid]>A[hi]?的條件,以二分法定位到最小的那一個值的下標(biāo),注意當(dāng)?A[mid]<=A[hi]?的時候,應(yīng)該是hi=mid,因為此時的mid有可能就是最小點,所以不能放過。【當(dāng)要求的點不是直接定位的mid的時候(等循環(huán)結(jié)束),mid 有可能就是最終的值,下一層的 lo 和 hi 的取值不能都把mid排除, 其中一個就是mid】

找到最小點后,記錄下來,然后繼續(xù)對原數(shù)組進(jìn)行二分法搜索,然而,參與比較的mid應(yīng)該改成realMid=(mid+rot)%n

以[4,5,6,7,0,1,2]為例,找到最小值(真起點)0的下標(biāo)4后,取mid=(0+6)/2 = 3,而真正的中點下標(biāo)應(yīng)該等于(mid+rot)%n = (3+4)%7 = 0

之后的向左右移動是一樣的,所以還是變化mid的值即可。

總結(jié)

以上是生活随笔為你收集整理的in the java search_LeetCode第[33]题(Java):Search in Rotated Sorted Array的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。