首页 > 其他分享 > 【LeeCode】581. 最短无序连续子数组

【LeeCode】581. 最短无序连续子数组

时间:2023-02-13 18:36:05浏览次数:76  
标签:nums int Solution 581 length 最短 LeeCode new public

LeeCode

【题目描述】

给你一个整数数组 ​​nums​​ ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。

请你找出符合题意的 最短 子数组,并输出它的长度。

 ​​https://leetcode.cn/problems/shortest-unsorted-continuous-subarray/?favorite=2cktkvj​


【示例】

 【LeeCode】581. 最短无序连续子数组_System


【代码】admin

思路: 要找中间的无须序列, 最简单的就是对比排序前后, begin和end的下标即可

package com.company;
import java.util.*;

// 2022-02-13
class Solution {
public int findUnsortedSubarray(int[] nums) {
// 复制一下原数组
int[] arr = Arrays.copyOf(nums, nums.length);
// 记录下标用
int begin = 0;
int end = 0;
// 原数组排序
Arrays.sort(nums);
// 从前往后, 新旧数组对比, 记录初始值
for (int i = 0; i < nums.length; i++){
if (nums[i] == arr[i]) {
continue;
}else {
begin = i;
break;
}
}
// 从后往前, 新旧数组对比, 记录结束值
for (int i = nums.length - 1; i >= 0; i--){
if (nums[i] == arr[i]){
continue;
}else {
end = i;
break;
}
}
// 如果begin等于end, 则表示原来的数组已排序 返回0
int res = end - begin == 0 ? 0 : end - begin + 1;
// System.out.println(res);
return res;
}
}
public class Test {
public static void main(String[] args) {
new Solution().findUnsortedSubarray( new int[]{2,6,4,8,10,9,15}); // 输出:5
new Solution().findUnsortedSubarray( new int[]{1,2,3,4}); // 输出:0
new Solution().findUnsortedSubarray( new int[]{1}); // 输出:0
}
}


【代码】​​排序​

package com.company;
import java.util.*;

// 2022-02-13
class Solution {
public int findUnsortedSubarray(int[] nums) {
if (isSorted(nums)){
return 0;
}
int[] arr = new int[nums.length];
System.arraycopy(nums, 0, arr, 0, nums.length);
// 这里排序, 因为第一步已经判断是否是有序数组, 所以不存在越界的问题
Arrays.sort(nums);
int left = 0;
while (nums[left] == arr[left]){
left++;
}
int right = nums.length - 1;
while (nums[right] == arr[right]){
right--;
}
// System.out.println(right - left + 1);
return right - left + 1;
}

private boolean isSorted(int[] nums) {
for (int i = 1; i < nums.length; i++){
if (nums[i] < nums[i - 1]){
return false;
}
}
return true;
}
}

public class Test {
public static void main(String[] args) {
new Solution().findUnsortedSubarray( new int[]{2,6,4,8,10,9,15}); // 输出:5
new Solution().findUnsortedSubarray( new int[]{1,2,3,4}); // 输出:0
new Solution().findUnsortedSubarray( new int[]{1}); // 输出:0
}
}


扩展:leecode看到另一个比较好的几个分析

 【LeeCode】581. 最短无序连续子数组_i++_02

 【LeeCode】581. 最短无序连续子数组_System_03


​变形题​

 【LeeCode】581. 最短无序连续子数组_数组_04

【代码】admin

package com.company;
import java.util.*;

// 2022-02-13
class Solution {
public List<Integer> findUnsortedSubarray2(int[] nums) {
List<Integer> list = new ArrayList<>();

for (int i = 1; i < nums.length; i++){
if (check(nums, i)){
list.add(i);
}
}
System.out.println(list);
}
// 分2步来: 左边小于 右边大于
private boolean check(int[] nums, int index) {
// 左边小于
for (int i = 0; i < index; i++){
if (nums[i] > nums[index]){
return false;
}
}
// 右边大于
for (int i = index + 1; i < nums.length; i++){
if (nums[index] > nums[i]){
return false;
}
}
return true;
}
}

public class Test {
public static void main(String[] args) {
new Solution().findUnsortedSubarray2(new int[] {2,3,1,8,9,20,12}); // 输出:3,4
}
}


【代码】​​儒雅随荷0​

 【LeeCode】581. 最短无序连续子数组_i++_05

class Solution {
public int[] findUnsortedSubarray(int[] nums) {
int[] temp = new int[nums.length];
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (int i = 0; i < nums.length; i++) {
if (nums[i] > max) {
max = nums[i];
} else {
temp[i] = -1;
}
if (nums[nums.length - i - 1] < min) {
min = nums[nums.length - i - 1];
} else {
temp[nums.length - i - 1] = -1;
}
}
List<Integer> list = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
if (temp[i] != -1) {
list.add(i);
}
}
int[] ans = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
ans[i] = list.get(i);
System.out.println(ans[i]);
}
return ans;
}

public static void main(String[] args) {
Solution solution = new Solution();
solution.findUnsortedSubarray(new int[] {2,3,1,8,9,20,12});
}
}

作者:儒雅随荷0
链接:https://leetcode.cn/problems/shortest-unsorted-continuous-subarray/solutions/920723/bian-xing-ti-zi-jie-mian-shi-by-chenjial-s4gi/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:nums,int,Solution,581,length,最短,LeeCode,new,public
From: https://blog.51cto.com/u_13682316/6054570

相关文章

  • 最短路
    最短路题目描述本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。如下图所示,G是一个无向图,其中蓝色边的长度是1、橘色边的长度是2、绿色边的长......
  • 基于Astar算法的栅格地图目标最短路径搜索算法MATLAB仿真,带GUI界面
    1.算法描述Astar算法是一种图形搜索算法,常用于寻路。它是个以广度优先搜索为基础,集Dijkstra算法与最佳优先(bestfit)算法特点于一身的一种算法。它通过下面这个函数来......
  • 基于GA算法的TSP最短路径搜索matlab仿真
    1.算法描述(1)编码:将问题的候选解用染色体表示,实现解空间向编码空间的映射过程。遗传算法不直接处理解空间的决策变量,而是将其转换成由基因按一定结构组成的染色体。编码方式......
  • 基于Astar算法的栅格地图目标最短路径搜索算法MATLAB仿真,带GUI界面
    1.算法描述       Astar算法是一种图形搜索算法,常用于寻路。它是个以广度优先搜索为基础,集Dijkstra算法与最佳优先(bestfit)算法特点于一身的一种算法。它通过......
  • 基于GA算法的TSP最短路径搜索matlab仿真
    1.算法描述(1)编码:将问题的候选解用染色体表示,实现解空间向编码空间的映射过程。遗传算法不直接处理解空间的决策变量,而是将其转换成由基因按一定结构组成的染色体。编码方......
  • 戴尔T5810电脑 Hackintosh 黑苹果efi引导文件
    原文来源于黑果魏叔官网,转载需注明出处。硬件型号驱动情况主板戴尔T5810,C610/612芯片处理器英特尔至强E5-2620v3已驱动内存12GB已驱动硬盘500GBWDBlueSolidStateDriv......
  • 力扣---2335. 装满杯子需要的最短总时长
    现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满2杯不同类型的水或者1杯任意类型的水。给你一个下标从0开始、长度为3的整数数组amount,其中amount[0......
  • 2335. 装满杯子需要的最短总时长
    题目现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满2杯不同类型的水或者1杯任意类型的水。给你一个下标从0开始、长度为3的整数数组amount,其中am......
  • 分层图最短路
    板子题双倍经验分层图最短路即为将一平面图建成立体分层的图不同层间用“电梯”相连接具体用途:对于可以选择修改路径长度的最短路能改几次就建几层的电梯也就是说......
  • m分别使用Dijkstra算法和Astar算法进行刚体机器人最短路径搜索和避障算法的matlab仿真
    1.算法描述Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止(BFS、pr......