文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。
这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。
相关文章:
- LeetCode:55. Jump Game(跳远比赛)
- Leetcode:300. Longest Increasing Subsequence(最大增长序列)
- LeetCode:560. Subarray Sum Equals K(找出数组中连续子串和等于k)
文章目录:
题目描述:
给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
你找到的子数组应是最短的,请输出它的长度。
示例 1:
输入: [2, 6, 4, 8, 10, 9, 15]
输出: 5
解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。
说明 :
输入的数组长度范围在 [1, 10,000]。
输入的数组可能包含重复元素 ,所以升序的意思是<=。
来源:力扣(LeetCode)
java实现方法1:
/**
* 查找最短没有排序的数组
*
* @param nums 数组
* @return 没排序数组长度
*/
private int shortestUnsortedContinuousSubarray(int[] nums) {
int[] newNums = Arrays.copyOfRange(nums, 0, nums.length);
Arrays.sort(newNums);
int i = 0;
int j = nums.length - 1;
while (i < j) {
if (nums[i] == newNums[i]) {
i++;
} else if (nums[j] == newNums[j]) {
j--;
} else if (i == j) {
return 0;
} else {
return j - i + 1;
}
}
return 0;
}
时间复杂度:O(n.logn)
空间复杂度:O(n)
python实现方法1:
def shortest_unsorted_continuous_subarray(self, nums: List[int]) -> bool:
'''
求最短不连续子数组
Args:
nums: 数据
Returns:
不连续子数组长度
'''
nums_sored = sorted(nums)
i, j = 0, len(nums) - 1
while i < j:
if nums[i] == nums_sored[i]:
i += 1
elif nums[j] == nums_sored[j]:
j -= 1
elif i == j:
return 0
else:
return j - i + 1
return 0