给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
请你找出符合题意的 最短 子数组,并输出它的长度。
1 <= nums.length <= 107
[2,6,4,8,10,9,15]
5
你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。
[1,2,3,4]
0
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param nums int整型一维数组 # @return int整型 # class Solution: def findUnsortedSubarray(self , nums ): # write code here num = sorted(nums) n_start = 0 n_end = len(nums) - 1 while n_start <= n_end: if nums[n_start] == num[n_start]: n_start += 1 elif nums[n_end] == num[n_end]: n_end -= 1 else: break return n_end - n_start +1
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
public int findUnsortedSubarray (int[] nums) {
// write code here
int[] sortedNums = Arrays.copyOfRange(nums, 0, nums.length);
Arrays.sort(sortedNums);
int start = 0;
while(start < nums.length){
if(sortedNums[start] != nums[start]) break;
start ++;
}
int end = nums.length - 1;
while(end >= 0){
if(sortedNums[end] != nums[end]) break;
end --;
}
return Math.max(end - start + 1, 0);
}
} def findUnsortedSubarray(nums):
n = len(nums)
if n <= 1:
return 0
left, right = 0, n-1
# 找到左端点
while left < n-1 and nums[left] <= nums[left+1]:
left += 1
# 已经有序
if left == n-1:
return 0
# 找到右端点
while right > 0 and nums[right] >= nums[right-1]:
right -= 1
# 找到中间最小值和最大值
min_num = float('inf')
max_num = float('-inf')
for i in range(left, right+1):
min_num = min(min_num, nums[i])
max_num = max(max_num, nums[i])
# 扩展左端点
while left >= 0 and nums[left] > min_num:
left -= 1
# 扩展右端点
while right < n and nums[right] < max_num:
right += 1
return right - left - 1
class Solution: def findUnsortedSubarray(self , nums ): sortNums = sorted(nums) i, j = 0, len(nums)-1 while i<len(nums): if nums[i] != sortNums[i]: break i += 1 while j>=i: # 防止重复比较 if nums[j] != sortNums[j]: break j -= 1 return j-i+1