js做題爽就爽在不用開編輯器
這個題目比較難,畢竟最後是用了on級別的演算法
做了下去看來大體上是對的,但是很多地方的小細節出了很多差錯,因為是在很睏的情況下做的題目
主要就是找到乙個視窗,裡面最小的數字往左挪動,右邊最大的數字往右挪。
不需要真實的交換,只是簡單的比較即可。
1、視窗裡面的重複數字怎麼辦? 不用管,因為視窗裡面有他們的位置,只需要找乙個代表出去即可。
2、陣列裡的重複數字怎麼辦?如果是降序的,就把它放到視窗裡面。 比如3,2,2,2,2,2 這些2要全部進去。
3、往左往右挪,會不會導致把更小或更大的陣列弄進視窗?
不會。往左移動可能會有比視窗裡面更大的數字,因為是降序找到這個最小數字的。
往右移動不會有小於最小值的數字,假如右邊有小於最小值的數字,那麼視窗裡面的數字全都比它大,它也是降序,也會被拉到視窗裡面的。
反證法很重要。
/*時間還行* * @param nums
* @return */
var findunsortedsubarray = function
(nums)
if(nums.length == 2)
else
}//滑動視窗,找到不合理的數字的範圍吧,順便記錄裡面的最大最小值,以及下標,因為最大最小值關係著子陣列的大小
//最小的一直往左交換位置,最大的一直往右交換位置,最後這個位置之差就是了
//最大的數往右邊交換,不會把小於最小的數換進來,因為如果右邊存在小於最小的數,那麼這個數當初肯定也會被納入到滑動視窗裡面去的
//倒是最左邊可能換入比最大還大的數,所以先弄好最小的數字開始
//還可能有重複元素,比如題目的9<10,不過10會一直換到最後,應該還好
//但是最小和最大的數字可能會有多個,不過好像這些重複數字會在滑動視窗裡有他們的位置,所以不用管
let low = -1,high = -1;
//如果當前值是降序,就是ture,用來記錄重複的數字[1,3,2,2,2] 4
let flag = false
;
let last = nums[0];
for(let i=1;i)
else
flag = true
;
}else
if(nums[i]===last)
}else
last =nums[i];
}//找到最小和最大的數字
//陣列的內容可以使正負數
let min =nums[low];
let max =nums[low];
for(let i=low;i<=high;i++)
if(nums[i]>max)
}//一直挪左邊的
//直接和視窗外面的比即可
//視窗外面要麼是重複數字,要麼是公升序排好的,如果遇到比自己還小或相等的,就是應該退出了
for(let i =low-1;i>=0;i--)
}else
}//挪右邊的
for(let i=high+1;i)
else
}if(high===low)
else
//[2,1] 2 0
//如果整個陣列是逆序的,這個方法不行啊
//[3,2,1]應該可以,2是low,1是high
//[-1,-1,-1,-1]
};
先用乙個輔助陣列儲存,然後將輔助陣列排序,輔助陣列裡面,肯定會有一部分數字和原來的不一樣。
1,2,3【】,8,9
那麼這個【】其實就是子陣列的大小....因為,確實,按照我的方式,往左往右挪了之後的陣列,也是這樣
然後從左找到第乙個不同的數字
從右找到第乙個。
【】就是源陣列裡面,亂序的數字再正確排序下,應該在的範圍。
好難啊,轉不過彎
leetcode 581 最短無序連續子陣列
給定乙個整數陣列,你需要尋找乙個連續的子陣列,如果對這個子陣列進行公升序排序,那麼整個陣列都會變為公升序排序。你找到的子陣列應是最短的,請輸出它的長度。示例 1 輸入 2,6,4,8,10,9,15 輸出 5 解釋 你只需要對 6,4,8,10,9 進行公升序排序,那麼整個表都會變為公升序排序。說明...
leetcode 581 最短無序連續子陣列
給定乙個整數陣列,你需要尋找乙個連續的子陣列,如果對這個子陣列進行公升序排序,那麼整個陣列都會變為公升序排序。你找到的子陣列應是最短的,請輸出它的長度。示例 1 輸入 2,6,4,8,10,9,15 輸出 5 解釋 你只需要對 6,4,8,10,9 進行公升序排序,那麼整個表都會變為公升序排序。說明...
LeetCode581 最短無序連續子陣列
給定乙個整數陣列,你需要尋找乙個連續的子陣列,如果對這個子陣列進行公升序排序,那麼整個陣列都會變為公升序排序。你找到的子陣列應是最短的,請輸出它的長度。示例 1 輸入 2,6,4,8,10,9,15 輸出 5 解釋 你只需要對 6,4,8,10,9 進行公升序排序,那麼整個表都會變為公升序排序。說明...