牛客NC209 最短无序连续子数组【中等 数组,双指针 C++/Java/Go/PHP】

题目

在这里插入图片描述
题目链接:
https://www.nowcoder.com/practice/d17f4abd1d114617b51e951027be312e

思路

解题思路
1、方法1,排序对比:将数组按升序排序,然后与原数组对照,
         从哪里开始变化到哪里结束变化的数组就是答案。
2、 方法2,别人的代码:效率更高,时间复杂度O(n),空间复杂度O(1)。但很难想到,
下面的答案里注释处提供了该代码

参考答案C++

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型vector
     * @return int整型
     */
    int findUnsortedSubarray(vector<int>& nums) {
        /*
          二、解题思路
          1、方法,排序对比:将数组按升序排序,然后与原数组对照,
             从哪里开始变化到哪里结束变化的数组就是答案。
          2、 方法,别人的代码:效率更高,时间复杂度O(n),空间复杂度O(1)。但很难想到
        */

        int n = nums.size();
        vector<int> bak(n);
        for (int k = 0; k < n; k++) {
            bak[k] = nums[k];
        }
        int left = -1;
        int right = -1;
        sort(nums.begin(), nums.end());
        for (int i = 0; i < n; i++) {
            if (left == -1 && nums[i] != bak[i]) {
                left = i;
            }
            if (right == -1 && nums[n - i - 1] != bak[n - i - 1]) {
                right = n - i - 1;
            }
        }

        if ( right == -1 ) {
            return 0;
        } else {
            return right - left + 1;
        }

        /*
                 2、 方法,别人的代码:效率更高,时间复杂度O(n),空间复杂度O(1)。但很难想到
                    //双指针
                    //我们实际上需要找到的边界就是从左往右,找到比左边最大值还小的最右下标,
                    //从右往左,找到比右边最小值还大的最左下标。
                    //https://www.cnblogs.com/xqmeng/p/15093340.html
                class Solution {
                public:
                    int findUnsortedSubarray(vector<int>& nums) {
                        int n = nums.size();
                        int maxn = INT_MIN, right = -1;
                        int minn = INT_MAX, left = -1;
                        for (int i = 0; i < n; i++) {
                            if (maxn > nums[i]) {
                                right = i;
                            } else {
                                maxn = nums[i];
                            }
                            if (minn < nums[n - i - 1]) {
                                left = n - i - 1;
                            } else {
                                minn = nums[n - i - 1];
                            }
                        }
                        return right == -1 ? 0 : right - left + 1;
                    }
                };
        */
    }
};

参考答案Java

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return int整型
     */
    public int findUnsortedSubarray (int[] nums) {
        int n = nums.length;
        int[] bak = new int[n];
        for (int i = 0; i < n ; i++) {
            bak[i] = nums[i];
        }

        Arrays.sort(nums);
        int left = -1, right = -1;
        for (int i = 0; i < n ; i++) {
            if (left == -1 && nums[i] != bak[i]) {
                left = i;
            }

            if (right == -1 && nums[n - i - 1] != bak[n - i - 1]) {
                right = n - i - 1;
            }
        }

        return right == -1 ? 0 : right - left + 1;
    }


    public int f2(int[]
                  nums) { //别人的代码,最优解。时间复杂度O(n),空间复杂度O(1)。但很难想到
        //双指针
        //我们实际上需要找到的边界就是从左往右,找到比左边最大值还小的最右下标,
        //从右往左,找到比右边最小值还大的最左下标。
        //https://www.cnblogs.com/xqmeng/p/15093340.html
        int n = nums.length;
        int maxn = 0x80000000, right = -1;
        int minn = 0x7fffffff, left = -1;
        for (int i = 0; i < n; i++) {
            if (maxn > nums[i]) {
                right = i;
            } else {
                maxn = nums[i];
            }

            if (minn < nums[n - i - 1]) {
                left = n - i - 1;
            } else {
                minn = nums[n - i - 1];
            }
            //System.out.println(i+":  left="+left+",right="+right+" maxn="+maxn+",minn="+minn);
        }

        return right == -1 ? 0 : right - left + 1;
    }
}

参考答案Go

package main

import "sort"

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param nums int整型一维数组
 * @return int整型
 */
func findUnsortedSubarray(nums []int) int {
	/*
	   二、解题思路
	   1、方法,排序对比:将数组按升序排序,然后与原数组对照,
	      从哪里开始变化到哪里结束变化的数组就是答案。
	   2、 方法,别人的代码:效率更高,时间复杂度O(n),空间复杂度O(1)。但很难想到
	*/

	n := len(nums)
	bak := make([]int, n)
	for k, v := range nums {
		bak[k] = v
	}
	left := -1
	right := -1
	sort.Ints(nums)
	for i := 0; i < n; i++ {
		if left == -1 && nums[i] != bak[i] {
			left = i
		}
		if right == -1 && nums[n-i-1] != bak[n-i-1] {
			right = n - i - 1
		}
	}

	if right == -1 {
		return 0
	} else {
		return right - left + 1
	}

	/*
			 2、 方法,别人的代码:效率更高,时间复杂度O(n),空间复杂度O(1)。但很难想到
				//双指针
		        //我们实际上需要找到的边界就是从左往右,找到比左边最大值还小的最右下标,
		        //从右往左,找到比右边最小值还大的最左下标。
				//https://www.cnblogs.com/xqmeng/p/15093340.html
			class Solution {
			public:
			    int findUnsortedSubarray(vector<int>& nums) {
			        int n = nums.size();
			        int maxn = INT_MIN, right = -1;
			        int minn = INT_MAX, left = -1;
			        for (int i = 0; i < n; i++) {
			            if (maxn > nums[i]) {
			                right = i;
			            } else {
			                maxn = nums[i];
			            }
			            if (minn < nums[n - i - 1]) {
			                left = n - i - 1;
			            } else {
			                minn = nums[n - i - 1];
			            }
			        }
			        return right == -1 ? 0 : right - left + 1;
			    }
			};
	*/
}

参考答案PHP

<?php


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @return int整型
 */
function findUnsortedSubarray( $nums )
{
    /*
    二、解题思路
    1、方法,排序对比:将数组按升序排序,然后与原数组对照,
       从哪里开始变化到哪里结束变化的数组就是答案。
    2、 方法,别人的代码:效率更高,时间复杂度O(n),空间复杂度O(1)。但很难想到
 */
    $bak = [];
    foreach ($nums as $k=>$v){
        $bak[$k] = $v;
    }

    sort($nums);

    $left =-1;
    $right =-1;

    for($i=0;$i<count($nums);$i++){
        if($left ==-1 && $nums[$i]!=$bak[$i]){
            $left = $i;
        }

        if($right ==-1 &&$nums[count($nums)-$i-1] !=$bak[count($bak)-$i-1]){
            $right = count($nums)-$i-1;
        }
    }
    if($right ==-1){
        return 0;
    }else{
        return $right -$left+1;
    }

	/*
			 2、 方法,别人的代码:效率更高,时间复杂度O(n),空间复杂度O(1)。但很难想到
				//双指针
		        //我们实际上需要找到的边界就是从左往右,找到比左边最大值还小的最右下标,
		        //从右往左,找到比右边最小值还大的最左下标。
	            //https://www.cnblogs.com/xqmeng/p/15093340.html
			class Solution {
			public:
			    int findUnsortedSubarray(vector<int>& nums) {
			        int n = nums.size();
			        int maxn = INT_MIN, right = -1;
			        int minn = INT_MAX, left = -1;
			        for (int i = 0; i < n; i++) {
			            if (maxn > nums[i]) {
			                right = i;
			            } else {
			                maxn = nums[i];
			            }
			            if (minn < nums[n - i - 1]) {
			                left = n - i - 1;
			            } else {
			                minn = nums[n - i - 1];
			            }
			        }
			        return right == -1 ? 0 : right - left + 1;
			    }
			};
	*/
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/573348.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图像处理技术与应用(二)

图像处理技术与应用入门 椒盐噪声 椒盐噪声&#xff0c;也称为脉冲噪声&#xff0c;是一种常见的数字图像噪声。它通常表现为图像中随机出现的白色&#xff08;椒&#xff09;或黑色&#xff08;盐&#xff09;像素点&#xff0c;这些像素点在图像上呈现为黑白杂点。椒盐噪声…

云计算革新:以太网 Scale-UP 网络为 GPU 加速赋能

谈谈基于以太网的GPU Scale-UP网络 Intel Gaudi-3 采用 RoCE 互联技术&#xff0c;促进了 Scale-UP 解决方案。业界专家 Jim Keller 倡导以太网替代 NVLink。Tenstorrent 成功应用以太网实现片上网络互联。RoCE 和以太网已成为互联解决方案的新兴趋势&#xff0c;为高性能计算提…

前端H5动态背景登录页面(下)

最近正好有点儿时间&#xff0c;把之前没整理完的前端动态背景登录页面给整理一下&#xff01;这是之前的连接前端H5动态背景登录页面&#xff08;上&#xff09;&#xff0c;这主要是两个登陆页面&#xff0c;一个彩色气泡&#xff0c;一个动态云朵&#xff0c;感兴趣的可以点…

关爱通丨从AIGC到硅基人同事:人工智能迭代重塑HR管理策略

2024年&#xff0c;一股创新的浪潮悄无声息地席卷了全球&#xff0c;推动了人工智能领域的重大突破。Sora视频模型的惊艳发布&#xff0c;成为了这一创新浪潮的标志性事件。 Sora这个名字源自日语中的“空”&#xff08;そら sora&#xff09;&#xff0c;象征着天空的无限广阔…

机器学习作业3____决策树(CART算法)

目录 一、简介 二、具体步骤 样例&#xff1a; 三、代码 四、结果 五、问题与解决 一、简介 CART&#xff08;Classification and Regression Trees&#xff09;是一种常用的决策树算法&#xff0c;可用于分类和回归任务。这个算法由Breiman等人于1984年提出&#xff0c;它…

sorensen索伦森电源维修XRF系列程控电源XRF600-4

AMETEK直流电源产品有两种类型&#xff1a;固定量程类型和自动量程类型。 固定量程电源是经济型的&#xff0c;输出范围为传统的矩形范围。 自动量程电源&#xff0c;在满输出功率的基础上&#xff0c;扩展了电流和电压的输出范围&#xff0c;使其能够满足更广泛的测试需求&am…

自由场、半自由场、扩散场

按声场性质可以将声场分为三类&#xff1a;自由声场、半自由声场、扩散声场 分别对应着全消声室&#xff0c;半消声室&#xff0c;混响室 自由声场&#xff1a; 声源在均匀、各向同性媒介中传播时&#xff0c;不计边界影响的声场&#xff0c;此时声场中只有直达声没有反射声。…

数据库系统原理实验报告4 | 数据完整性

整理自博主本科《数据库系统原理》专业课自己完成的实验报告&#xff0c;以便各位学习数据库系统概论的小伙伴们参考、学习。 专业课本&#xff1a; ———— 本次实验使用到的图形化工具&#xff1a;Heidisql 目录 一、实验目的 二、实验内容 1、建表 2、对1题中创建的Stud…

MySQL--mysql的安装(压缩包安装保姆级教程)

官网下载&#xff1a;www.mysql.com MySQL :: Download MySQL Community Server (Archived Versions) 1.MySQL下载流程&#xff1a; 第一步&#xff1a;点击download&#xff0c; 下滑找到MySQL community&#xff08;gpl&#xff09;Downloads>> 第二步&#xff1a;点…

问题-MySQL将较大的SQL文件导入MySQL

迁移数据的时候&#xff0c;我们有时候会用sqlyog等数据库工具导入到新数据库。可能插入的SQL语句太大&#xff0c;出现导入一半失败的情况。明明代码没错&#xff0c;这让人摸不着头脑。 对于大文件导入&#xff0c;有几种方法&#xff1a; 方法1&#xff1a;使用命令行&…

这几种MBTI,活该做项目经理!

最近公司群里发了一个性格测试&#xff08;MBTI&#xff09;&#xff0c;让根据大家测出来的性格&#xff0c;适当挖掘一下自身潜力。 当对照性格解析时&#xff0c;才发现公司里真是卧虎藏龙&#xff0c;而且每个人测出来的性格和平时表现出的自己都非常贴合。 MBTI性格测试…

2024年Q1企业邮箱安全性研究报告:钓鱼邮件同比增长59.9%

4月23日&#xff0c;Coremail邮件安全联合北京中睿天下信息技术有限公司发布《2024年第一季度企业邮箱安全性研究报告》。对当前企业邮箱的应用状况和安全风险进行了分析。 1、垃圾邮件持续增长 根据Coremail邮件安全人工智能实验室最新数据显示&#xff0c;2024年第一季度&am…

Postman - 设置变量

场景&#xff1a; 比如你接口都有权限&#xff0c;访问需要每调一个接口都手动放token的值&#xff0c;这个时候就可以搞个全局的变量&#xff0c;只设置一次就可以了 1、设置变量 Environments -> Globals - > 设置key 、value 2、使用变量 {{你得变量名-key}} 3…

电动车DC-DC80V降33V/12V 3A大功率同步降压芯片_AH1008

AH1008是一款专为电动车设计的同步降压芯片&#xff0c;TEL&#xff1a;186*4884*3702*能够将输入电压从80V稳定地降至33V或12V&#xff0c;并提供最大3A的输出电流。该芯片采用了先进的同步降压转换技术&#xff0c;有效降低了能量损耗&#xff0c;提升了转换效率&#xff0c;…

做抖音小店,“自然流量”和“达人带货”,选择哪个更香?

大家好&#xff0c;我是电商笨笨熊 做抖音小店&#xff0c;关于选择自然流还是达人带货&#xff0c;从推出时就一直争吵到现在&#xff1b; 有人觉得自然流不需要佣金&#xff0c;一次性带来的爆单量很大&#xff1b; 有人觉得达人带货细水长流&#xff0c;虽然需要佣金&…

【大语言模型LLM】-基础语言模型和指令微调的语言模型

&#x1f525;博客主页&#xff1a;西瓜WiFi &#x1f3a5;系列专栏&#xff1a;《大语言模型》 很多非常有趣的模型&#xff0c;值得收藏&#xff0c;满足大家的收集癖&#xff01; 如果觉得有用&#xff0c;请三连&#x1f44d;⭐❤️&#xff0c;谢谢&#xff01; 长期不…

干货教程【AI篇】| 真人照片转动漫AI工具分享

今天给大家分享一个真人照片转动漫的工具。用真是拍摄的照片生成动漫/漫画/手绘/卡通图的工具。 需要这个工具的同学可以关注【文章底部公众号】&#xff0c;回复关键词【zpdm】即可获取本文所讲工具。 首先我们将下载下来的压缩包解压 直接双击红框内的文件就可以运行了。启…

ThinkPad E14 Gen 4,R14 Gen 4,E15 Gen 4(21E3,21E4,21E5,21E6,21E7)原厂Win11系统恢复镜像下载

lenovo联想ThinkPad笔记本电脑原装出厂Windows11系统安装包&#xff0c;恢复出厂开箱状态一模一样 适用型号&#xff1a;ThinkPad E14 Gen 4,ThinkPad R14 Gen 4,ThinkPad E15 Gen 4 (21E3,21E4,21E5,21E6,21E7) 链接&#xff1a;https://pan.baidu.com/s/1QRHlg2yT_RFQ81Tg…

解决在 Python 数据分析中遇到的 Matplotlib 字体警告问题

当在 Python 数据分析中遇到类似以下警告时&#xff1a; D:\anaconda3\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 24037 missing from current font.font.set_text(s, 0.0, flagsflags) D:\anaconda3\lib\site-packages\matplotlib\ba…

【前端】3. CSS【万字长文】

CSS 是什么 层叠样式表 (Cascading Style Sheets). CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果. 能够做到页面的样式和结构分离. CSS 就是 “东方四大邪术” 之化妆术. 基本语法规范 选择器 {一条/N条声明} 选择器决定针对谁修改 (找谁)声明决…