您好,登錄后才能下訂單哦!
小編給大家分享一下golang刷leetcode技巧之如何實現排序變形,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
假設按照升序排序的數組在預先未知的某個點上進行了旋轉。
( 例如,數組 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。
請找出其中最小的元素。
你可以假設數組中不存在重復元素。
示例 1:
輸入: [3,4,5,1,2]
輸出: 1
示例 2:
輸入: [4,5,6,7,0,1,2]
輸出: 0
解題思路:
1,因為兩部分仍然有序所以可以二分查找
2,如果arr[mid]<arr[r]著在左部分查找,否則在右部分
func findMin(nums []int) int {
return find(nums,0,len(nums)-1)
}
func find(nums[]int ,l,r int)int{
mid:=(l+r)/2
if mid==l ||mid==r{
if nums[l]<nums[r]{
return nums[l]
}
return nums[r]
}
if nums[mid]<nums[r]{
return find(nums,l,mid)
}
return find(nums,mid,r)
}
給定一個整數數組,編寫一個函數,找出索引m和n,只要將索引區間[m,n]的元素排好序,整個數組就是有序的。注意:n-m盡量最小,也就是說,找出符合條件的最短序列。函數返回值為[m,n],若不存在這樣的m和n(例如整個數組是有序的),請返回[-1,-1]。
示例:
輸入:[1,2,4,7,10,11,7,12,6,7,16,18,19]
輸出:[3,9]
提示:
0 <= len(array) <= 1000000
解題思路:
1,將數組劃分成三部分,左邊的最大值一定小于中間和右邊部分
從左往右遍歷,依次取最大值,最后一個比最大值小的位置,是中間部分的右邊界(因為右邊部分,比中間和左邊大)
2,右邊最小值比中間和左邊部分大,從最右往左遍歷,取最小值,最后一個比最小值大的位置就是左邊界
3,看左邊界是不是比右邊界小
代碼實現:
func subSort(array []int) []int {
le:=len(array)-1
if le<1{
return []int{-1,-1}
}
min:=1000000
max:=-1000000
l:=le
r:=0
/**
1,2,4, || 7,10,11,7,12,6,7, || 16,18,19
左邊 中間 右邊
最后是三個部分,左邊的最大值必須小于其右邊(中間和右邊)的最小值,
右邊的最小值必須大于其左邊(左邊和中間)的最大值;
那么從左往右找的是最大值,如果出現小于左邊最大值的情況,那么更新 rightindex,最后的 rightindex 右邊的必然大于這個最大值;
從右往左找的是最小值,如果出現大于這個值的情況,那么更新 leftindex,
最后的 leftindex 左邊的必然小于這個最小值;
*/
for i:=0;i<=le;i++{
if array[i]>=max{
max=array[i]
}else{
r=i
}
if array[le-i]<=min{
min=array[le-i]
}else{
l=le-i
}
}
if l<r{
return []int{l,r}
}
return []int{-1,-1}
}
以上是“golang刷leetcode技巧之如何實現排序變形”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。