hot100:数组——31、33

news2024/9/27 12:14:36

31. 下一个排列

思路:其实这道题的意思就是,简单地说,就是找到一个比现有的给出的数组代表的值大的最小的数
比如给出的数组是[1,2,3],它代表的数值是123,现有的元素组成的数值中,比123大的有很多,比如:213,231,312,321……,这些数中最小的一个是132,表示成数组就是[1,3,2]。此集合就是我们要输出的。
在这里插入图片描述
解题思路:
1、首先从后先前找,找到第一个满足A[i] < A[j]的位置(i,j),如果这个位置后面还有元素,那么后面的元素必然是降序排列(j及j之后的元素),说明在后面的元素中,j处的元素是最大的。
为啥要从后往前找第一个升序对,但是因为,每次输出的值都是将数值中尽可能较低位上的元素进行交换,这样得到的就是比现有数值大,但同时又是比现有数值大的元素集合中最小的数。

2、再从后向前找(从数组末尾到j的范围中),找第一个满足A[i] < A[k] 的 k。
因为虽然j出元素比i处的大,但是如果直接交换这两个元素,并不一定保证改动最小,由于j后都是降序,从后向前找到的元素是比i处元素大的最小的一个数,交换他们能够达到目的

3、交换两个元素后,还需要将j及j后的元素变成升序
因为已经将k处和i处交换,减缓后j后元素仍未降序,需要将其改成升序来世得到的值最小

4、如果没有找到这个(i,j)位置,说明整个数组都是降序,代表这个值已经是最大的,根据题意,此时应该将所有元素反转

第一遍错误:

class Solution {
    public void nextPermutation(int[] nums) {
        if(nums.length==1) return;
        int i=nums.length-2;
        while(i>0&&nums[i]>=nums[i+1]){
            i--;
        }
        if(i>0){
            int j=nums.length-1;
            while(j>i&&nums[j]<=nums[i]){
                j--;
            }
                swap(nums,i,j);
                reverse(nums,i+1,nums.length-1);
        }else{
            reverse(nums,i,nums.length-1);
        }
    }
    public void swap(int[] nums,int i,int j){
        int temp=nums[j];
        nums[j]=nums[i];
        nums[i]=temp;
    }
    public void reverse(int[] nums,int i,int j){
        while(i<j){
            swap(nums,i,j);
            i++;
            j--;
        }
    }
}

原因:
在这里插入图片描述
在这个例子中,i经过while循环,已经在0号位值,而根据代码,i=0时,要将整个数组反转,代码以为i处于0号位置时,整个数组都是降序,直接反转即可,但是这种情况没有考虑。仔细考虑后发现,其实整个数组是降序的表现不应该是i处于0号位置,因为如果i在0处,说明0和1是一对升序。如果i=-1,才能说明整个数组都是降序

改进:

class Solution {
    public void nextPermutation(int[] nums) {
        int i=nums.length-2;
        while(i>=0&&nums[i]>=nums[i+1]){
            i--;
        }
        if(i>=0){
            int j=nums.length-1;
            while(j>i&&nums[j]<=nums[i]){
                j--;
            }
                swap(nums,i,j);
        }
            reverse(nums,i+1,nums.length-1);
    }
    public void swap(int[] nums,int i,int j){
        int temp=nums[j];
        nums[j]=nums[i];
        nums[i]=temp;
    }
    public void reverse(int[] nums,int i,int j){
        while(i<j){
            swap(nums,i,j);
            i++;
            j--;
        }
    }
}

33. 搜索旋转排序数组

实话说一开始我感觉这是个弱智题,直接从头遍历,看看target元素在不在不就行了,整的这么花里胡哨。结果一看,要求 O(log n) 的时间复杂度……果然还是我弱智

思路:虽然是旋转,但是从中间分成的两部分中肯定有一部分仍然是有序的,主要看target在哪部分范围内,使用二分查找。

受先判断,mid分开的两个部分,有一部分肯定是有序的,剩下的部分要么全部有序,要么部分有序。
如果是[0,mid)有序:
①先判断target大小,如果在mid左边,将搜索范围缩小至[0,mid)
②否则在[mid,num.length-1]范围寻找
如果是[mid,num.length-1]有序:
同上

代码:

class Solution {
    public int search(int[] nums, int target) {
        if(nums.length==1){
            if(target==nums[0]) return 0;
            return -1;
        }
        int l=0,mid=0,r=nums.length-1;
        while(l<=r){
            mid=(l+r)/2;
            if(nums[mid]==target){
                return mid;
            }
            if(nums[l]<=nums[mid]){//一开始这里没加等号,出错了
                if(nums[l]<=target&&target<nums[mid]){
                    r=mid-1;
                }else{
                    l=mid+1;
                }
            }else{
                if(nums[mid]<target&&target<=nums[r]){
                    l=mid+1;
                }else{
                    r=mid-1;
                }
            }
        }
        return -1;
    }
}

首先是在num[l]和nums[mid]这里,比较需要加等号,虽然题目中说了元素没有重复的,但是有可能l和mid指向的是同一个元素,比如[3,1],target=1

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.6 n维随机变量

学习目标&#xff1a; 学习n维随机变量需要掌握一定的数学知识&#xff0c;包括多元微积分、线性代数和概率论等。要学习n维随机变量&#xff0c;我会采取以下步骤&#xff1a; 复习相关的数学知识&#xff1a;首先&#xff0c;我会复习多元微积分、线性代数和概率论的基本知…

OpenCV介绍与GUI特征(一)

目录0.1 OpenCV-Python教程简介OpenCVOpenCV-PythonOpenCV-Python教程OpenCV需要你!!!贡献者0.2 在Windows中安装OpenCV-Python目标从预制的二进制文件中安装OpenCV从源代码构建OpenCV练习0.3 在Ubuntu中安装OpenCV-Python目标从预制的二进制文件中安装OpenCV-Python从源码构建…

Revit怎么绘制结构梁?一键生成梁?

绘制结构梁是Revit基础的功能&#xff0c;对于不少刚接触Revit的小伙伴来说似乎还无从下手&#xff0c;今天就让小编来告诉大家在Revit中绘制结构梁的方法。 一、Revit中结构梁图文绘制过程 首先&#xff0c;我们选择“结构”选项卡中的“梁”工具&#xff0c;点击选择梁的类…

android12 displayArea学习

一&#xff1a;数据结构分析 1&#xff1a;android 12 WindowContainer 的类继承关系如下 下图为 WindowContainer 简要的对象图。 下图是 Aosp默认的display层次结构对象图。 Aosp定义的feature有如下 FEATURE_ROOT 0; FEATURE_DEFAULT_TASK_CONTAINER 1; FEATURE_WINDOW_…

DNS服务器 - 理论

DNS服务器1. 概念2. DNS域名结构3. 域名的分级4. 域名服务器5. 域名解析过程5.1 递归查询与迭代查询5.2 解析流程1. 迭代查询2. 递归查询6. 高速缓存&#xff1a;7. 加上主机缓存后的DNS解析流程8. 常见的域名解析记录9. DNS正向解析和反向解析1. 概念 DNS服务器&#xff08;D…

C++指针与其它复合类型

目录 前言&#xff1a; 1.指针与字符串 1.1cout接收char类型的地址的反应 1.2字符串字面值 1.3字符串备份 2.使用new创建动态结构 3.使用new和delete搭配存储键盘输入的字符串 前言&#xff1a; 指针我们已经知道如何使用了&#xff0c;也知道指针和数组配合起来使用&am…

DHCP及中继(UOS)

DHCP服务器 中继器 客户端 服务器 安装DHCP apt install isc-dhcp-server -y 编辑配置文件 vim /etc/dhcp/dhcpd.conf 重启服务 systemctl restart isc-dhcp-server 配置监听网卡 vim /etc/default/isc-dhcp-server 中继器 安装dhcp yum install dhcp -y nmtui 修改…

【LeetCode每日一题: 1042. 不邻接植花 | 图论 | 染色问题】

&#x1f34e;作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域新星创作者&#x1f3c6;&#xff0c;保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享&#x1f48e;&#x1f48e;&#x1f48e; &#x1f34e;座右…

Qt中调用C#制作的com组件

作者&#xff1a;billy 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 前言 这里记录一下在 Qt 64位程序中调用 C# 制作的 com 组件的流程&#xff0c;方便后期自己回顾。 1. 了解 TLB 格式 拿到的依赖库最…

hbase进阶操作——读流程与写流程介绍

系列文章目录 centos7虚拟机下hbase的使用案例讲解 文章目录 系列文章目录 一、hbase架构原理 1.1、StoreFile 1.2、MemStore 1.3、WAL 二、hbase的写流程 2.1、写流程的流程图 2.2、写流程的流程图说明 三、hbase读流程 3.1、读流程的流程图 3.2、读流程的流程图解…

C/C++|物联网开发入门+项目实战|指针|嵌入式C语言高级|C语言内存空间的使用-学习笔记(9)

文章目录2-3 : C语言内存空间的使用指针概述示例&#xff1a;指针修饰符指针运算符示例示例1多级指针例子省略argc&#xff08;个数&#xff09;的常用写法&#xff1a;参考&#xff1a; 麦子学院-嵌入式C语言高级-内存空间2-3 : C语言内存空间的使用 指针概述 内存类型资源地…

CPU工作原理

CPU&#xff08;中央处理器&#xff09;是计算机中的重要组件&#xff0c;它负责执行计算机程序中的指令。在了解CPU的工作原理之前&#xff0c;我们需要先了解一些基本概念。 指令和指令集 指令是计算机程序中的基本单位&#xff0c;它指示计算机执行某个操作。指令集是一组…

我在“Now In Android”中学到的 9 件事

我在“Now In Android”中学到的 9 件事 Now in Android是一款功能齐全的 Android 应用程序&#xff0c;完全使用 Kotlin 和 Jetpack Compose 构建。它遵循 Android 设计和开发最佳实践&#xff0c;旨在为开发人员提供有用的参考。 https://github.com/android/nowinandroid UI…

淘宝悄悄内测“店号一体”的新模式

4月17日消息&#xff0c;淘宝近日已开始小规模测试“店号一体”新模式。新模式下&#xff0c;淘宝店铺将与逛逛、直播等账号完全打通&#xff1b;此前针对达人及内容型商家的新店铺模式“视频内容店”也同步升级。 内测商家透露&#xff0c;目前在淘宝发布的图文、短视频、直播…

腾讯学长分享的这份Java面试八股文手册,让我GitHub下载量破百万!!!

一些不满现状&#xff0c;被外界的“高薪”“好福利”吸引的人&#xff0c;一般就在这时候毅然决然地跳槽了。 跳槽是为了寻求更好的发展&#xff0c;但在跳槽前我们也不能确定下家就是更好的归宿&#xff0c;这就更加需要我们审慎地去对待&#xff0c;不能盲目跳槽。 其次&a…

知识图谱专栏简介:数据增强,智能标注,文本信息抽取(实体关系事件抽取)、知识融合算法方案、知识推理、模型优化、模型压缩技术等

知识图谱专栏简介&#xff1a;数据增强&#xff0c;智能标注&#xff0c;文本信息抽取&#xff08;实体关系事件抽取&#xff09;、知识融合算法方案、知识推理、模型优化、模型压缩技术等 专栏链接&#xff1a;NLP知识图谱相关技术业务落地方案和码源 NLP知识图谱相关技术业…

程序员跳槽薪水涨了一倍,谈谈java工程师找新工作的八大技巧

大家好&#xff0c;这几天发生了一些事情&#xff0c;我找到了一份新工作&#xff0c;明天是第一天上班。我想先谈一下我的新工作待遇&#xff0c;因为我觉得相对来说还算比较满意。接下来我想谈一下我的个人经历&#xff0c;从毕业到现在的工作经历。第三个话题是我最近半个月…

k-d Tree算法

1.概述 本文介绍一种用于高维空间中的快速最近邻和近似最近邻查找技术——Kd- Tree(Kd树)。Kd-Tree&#xff0c;即K-dimensional tree&#xff0c;是一种高维索引树形数据结构&#xff0c;常用于在大规模的高维数据空间进行最近邻查找(Nearest Neighbor)和近似最近邻查找(Appro…

Java工程行业管理系统源码-专业的工程管理软件-提供一站式服务

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示1…

反向代理自建教程:你懂的

一、为什么需要自建反代 OpenAI提供了两种访问方式&#xff0c;一种是直接在ChatGPT网页端使用的Access Token方式&#xff0c;这种方式可以免费使用GPT-3.5模型&#xff0c;只需要登录即可使用。但缺点是不稳定&#xff0c;且无法扩展。另一种是使用API&#xff0c;注册用户可…