leetcode-581-Shortest Unsorted Continuous Subarray
題目描述:
Given an integer array, you need to find one?continuous subarray?that if you only sort this subarray in ascending order, then the whole array will be sorted in ascending order, too.
You need to find the?shortest?such subarray and output its length.
Example 1:
Input: [2, 6, 4, 8, 10, 9, 15] Output: 5 Explanation: You need to sort [6, 4, 8, 10, 9] in ascending order to make the whole array sorted in ascending order.?
Note:
?
要完成的函數(shù):
int findUnsortedSubarray(vector<int>& nums)?
?
說(shuō)明:
1、這道題給了一個(gè)vector,要求找到一個(gè)子數(shù)組,當(dāng)把這個(gè)子數(shù)組升序排列之后,整個(gè)數(shù)組也就升序排列了。要求找到那個(gè)最短的子數(shù)組。
2、我們可以先把數(shù)組升序排列,看一下數(shù)組中元素的最終位置,當(dāng)某個(gè)元素未排序之前沒(méi)有在它的最終位置,那意味著這個(gè)元素必須被排列過(guò),也就是會(huì)在子數(shù)組中。
題目給的例子,[2,6,4,8,10,9,15],升序排列之后為[2,4,6,8,9,10,15],我們可以看到4/6/9/10都沒(méi)有在最終位置上,這四個(gè)數(shù)必須被排列,元素8在最終位置上,但是由于整個(gè)子數(shù)組被升序排列,所以8也要包含在其中。
所以其實(shí)我們只需要找到——從左邊數(shù)起第一個(gè)沒(méi)有在最終位置的元素,和,從右邊數(shù)起第一個(gè)沒(méi)有在最終位置的元素。他們中間的元素必須被重新排列。
所以,代碼如下:
int findUnsortedSubarray(vector<int>& nums) {vector<int>nums1=nums;sort(nums.begin(),nums.end());int i,j;for(i=0;i<nums.size();i++){if(nums[i]!=nums1[i])break;}if(i==nums.size())//如果數(shù)組原先就是升序排列的return 0;for(j=nums.size()-1;j>=0;j--){if(nums[j]!=nums1[j])break;}return j-i+1;}上述代碼實(shí)測(cè)55ms,beats 24.74% of cpp submissions。
?
3、改進(jìn):
這道題還有其他方法可以做,筆者最開(kāi)始也是用的更加直接的方法……但是后來(lái)發(fā)現(xiàn)這個(gè)算法過(guò)程有點(diǎn)復(fù)雜……
等之后想到了再來(lái)更新吧。
?
轉(zhuǎn)載于:https://www.cnblogs.com/chenjx85/p/8992385.html
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的leetcode-581-Shortest Unsorted Continuous Subarray的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 重磅解读 | 赵义博:量子密码的绝对安全
- 下一篇: AtCoder Beginner Con