DAY6-力扣刷题

news2024/10/6 12:22:33

1.下一个排列

31. 下一个排列 - 力扣(LeetCode)

整数数组的一个 排列  就是将其所有成员以序列或线性顺序排列。

  • 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3][1,3,2][3,1,2][2,3,1] 。

整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。

  • 例如,arr = [1,2,3] 的下一个排列是 [1,3,2] 。
  • 类似地,arr = [2,3,1] 的下一个排列是 [3,1,2] 。
  • 而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。

给你一个整数数组 nums ,找出 nums 的下一个排列。

首先要了解字典序是什么

【算法】字典序超详细解析(让你有一种相见恨晚的感觉!)-CSDN博客

即就是每个字符串的字符挨个进行比较

方法一:两遍扫描

我们观察这一组数

我们注意到下一个排列总是比当前排列要大,除非该排列已经是最大的排列。

我们希望找到一种方法,能够找到一个大于当前序列的新序列,且变大的幅度尽可能小。具体地:

  1. 我们需要将一个左边的「较小数」与一个右边的「较大数」交换,以能够让当前排列变大,从而得到下一个排列。

  2. 同时我们要让这个「较小数」尽量靠右,而「较大数」尽可能小。当交换完成后,「较大数」右边的数需要按照升序重新排列。这样可以在保证新排列大于原来排列的情况下,使变大的幅度尽可能小。

class Solution {
    public void nextPermutation(int[] nums) {
        int i=nums.length-2;//从该下标开始
        while(i>=0&&nums[i]>=nums[i+1]){
            //只有遇到比最后一个数字小的数字才能弹出
            //否则就一直向前
            //此时就是第一次扫描
            //寻找非降序的a[i-1]
            i--;
        }
        // if(i>=0){
        //     //第二次扫描
        //     //扫描下标i之后
        //     //找到比寻找的a[i-1]大的数字
        //     int tmp=nums.length-1;//要找到比此下标大的数,在一定范围内
        //     int j;
        //     for(j=nums.length-1;j>i;j--){
        //         if(nums[j]<nums[i]){
        //             tmp=j;//更新下标
        //             break;
        //         }
        //     }
        //     swap(nums,i,tmp);
            
        // }
        if (i >= 0) {
            int j = nums.length - 1;
            while (j >i && nums[i] >= nums[j]) {
                j--;
            }
            swap(nums, i, j);
        }
        reverse(nums,i+1);//更新后续
    }
    public void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

    public void reverse(int[] nums, int start) {
        int left = start, right = nums.length - 1;
        while (left < right) {
            swap(nums, left, right);
            left++;
            right--;
        }
    }
}

 2.搜索旋转排序数组

33. 搜索旋转排序数组 - 力扣(LeetCode)

整数数组 nums 按升序排列,数组中的值 互不相同 。

在传递给函数之前,nums 在预先未知的某个下标 k0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

方法一:二分查找

 对于有序数组,可以使用二分查找的方法查找元素。

进行旋转后只保证了数组的局部是有序的,这还能进行二分查找吗?答案是可以的。 

始终有一侧是有序的

我们可以通过画图知道某一侧有序的特征!!!

class Solution {
    public int search(int[] nums, int target) {
        int n = nums.length;
        if (n == 0) {
            return -1;
        }
        if (n == 1) {
            return nums[0] == target ? 0 : -1;
        }
        // 上面是两种特殊情况
        int l = 0;
        int r = n - 1;
        while (l <= r) {
            int mid = (l + r) / 2;
            if (nums[mid] == target) {
                return mid;
            }
            if (nums[0] <= nums[mid]) {
                // 这个判断的就是左侧是有序的情况
                // 此时需要判断左部分是不是有序的
                // 判断是不是在该区间内
                //区间left,right范围内必须是闭的
                if (nums[0] <= target && target <nums[mid]) {
                    r = mid - 1;
                } else {
                    l = mid + 1;
                }
            } else {// 开始判断右侧是有序的情况
                if (nums[mid] < target && target <= nums[n - 1]) {
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
        }
        return -1;
    }
}

3.在排序数组中查找元素的第一个和最后一个位置

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

//看到该时间复杂度我想到了用二分法解决该问题

方法一:二分法

class Solution {
    public int[] searchRange(int[] nums, int target) {
        //首先进行特殊情况的处理
        if(nums.length==0){
            return new int[]{-1,-1};
        }
        if(nums.length==1){
            return nums[0]==target?new int[]{0,0}:new int[]{-1,-1};
        }
        int l=0,r=nums.length-1;
        while(l<=r){
            int mid=(l+r)/2;
            if(nums[mid]==target){
                l=r=mid;
                //找到左标记
                while(l>=1&&nums[l-1]==target){
                    l--;
                }
                //找到右标记
                while(r<nums.length-1&&nums[r+1]==target){
                    r++;
                }
                return new int[]{l,r};
            }
            if(nums[mid]>target){
                r=mid-1;
            }else{
                l=mid+1;
            }
        }
        return new int[]{-1,-1};
    }
}

 4.搜索插入位置

35. 搜索插入位置 - 力扣(LeetCode)

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

class Solution {
    public int searchInsert(int[] nums, int target) {
        //首先进行特殊情况的处理
        if(nums.length==0){
            return 0;
        }
        // if(nums.length==1){
        //     return nums[0]==target?0:-1;
        // }
        int l=0,r=nums.length-1;
        int ans=nums.length;
        while(l<=r){
            int mid=(l+r)/2;
            
            if(nums[mid]==target){
                return mid;
            }
            if(nums[mid]>=target){
                ans=mid;
                r=mid-1;
            }else{
                l=mid+1;
            }
        }
        return ans;
    }
}

 5.有效的数独

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

只能想到暴力求解的方法 

力扣的方法

方法一:一次遍历

三维数组的图形理解

class Solution {
    public boolean isValidSudoku(char[][] board) {
        //记录每一行每个数字出现的次数
        int[][] rows=new int[9][9];//9个数字每一行出现的次数,纵坐标代表数字几
        //记录每一列每个数字出现的次数
        int[][] columns=new int[9][9];
        //记录每一个小九宫格中每个数字出现的次数
        int[][][] subboxes=new int[3][3][9];
        for(int i=0;i<9;i++){
            for(int j=0;j<9;j++){
                char c=board[i][j];
                if(c!='.'){
                    int index=c-'0'-1;//转为数组,化为相应的下标
                    rows[i][index]++;
                    columns[j][index]++;
                    subboxes[i/3][j/3][index]++;
                    if(rows[i][index]>1||columns[j][index]>1||subboxes[i/3][j/3][index]>1){
                        return false;
                    }
                }
            }
        }
        return true;
    }
}

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

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

相关文章

2024年移动端技术探索

2024年移动端技术探索 引子 2023年号称AI元年&#xff0c;AI带来了一些不是很清晰的机会&#xff0c;没有看到有多好的落地&#xff0c;对于互联网&#xff0c;不止技术层面没有突破&#xff0c;业务层面的需求也断崖式下滑&#xff0c;没有创新就没有需求&#xff0c;老业务…

Folly,一个强大的C++库

目录 1.引言 2.Folly库的特点 3.Folly库的应用场景 4.示例代码 5.总结 1.引言 Folly 是Facebook开发的一个开源、无许可&#xff08;Apache 2.0&#xff09;的现代C库&#xff0c;旨在提升性能和简化编写复杂任务的工作流程。它包含了一系列用于系统级编程的工具&#xff…

联华集团:IT团队如何实现从成本中心提升至价值中心|OceanBase 《DB大咖说》(十)

OceanBase《DB大咖说》第 10 期&#xff0c;我们邀请到了联华集团的CTO楼杰&#xff0c;来分享他如何思考 IT 业务价值&#xff0c;以及联华华商数据库的升级实践。 楼杰从大学毕业后就进入了联华工作&#xff0c;并一直扎根在近 20 年的&#xff0c;从一名底层的技术员成长为…

Swift Combine — Future和Promise的使用

平时在开发的过程中&#xff0c;免不了进行异步编程&#xff0c;比如进行网络请求&#xff0c;以前异步编程的时候主要采用两种方法&#xff1a; 通过代理方法&#xff0c;设置代理&#xff0c;实现代理方法。通过闭包block块处理。 采用第一种方法代码分家&#xff0c;不利于…

eNSP学习——配置DHCP中继

目录 主要命令 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、基本配置 2、搭建OSPF网络 3、配置DHCP服务器 4、配置DHCP中继 5、配置PC获取地址方式为DHCP 主要命令 //配置指定DHCP服务器的方法 //方法一&#xff1a;在面向PC的接口下直接配置DHCP服…

CentOS 7.9上创建的JBOD阵列恢复(二)

系列文章目录 CentOS 7.9上创建JBOD&#xff08;一&#xff09; CentOS 7.9检测硬盘坏区、实物定位&#xff08;三&#xff09; 文章目录 系列文章目录前言一、用命令查看是否认到盘二、直接组JBOD三、挂载到新目录四、查看原数据总结 前言 在CentOS 7.9上创建了一个软阵列JB…

游戏运营与发行:从入门到实践

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

数据中心分类和类别综合指南

数据中心可根据其规模、功能、所有权、层级和部署方法进行分类。以下是一些典型的数据中心类别和分类。 数据中心的分类和分级 根据尺寸 1. 小型数据中心&#xff1a;通常是为了满足对IT基础设施需求较少的组织或小型企业的需求而创建的。与大型数据中心相比&#xff0c;小型…

Redis缓存设计之常见问题及解决方案

背景&#xff1a;缓存的常见问题及对应的解决方案进行了整理&#xff0c;给大家分享一下。 1.缓存穿透 缓存穿透是指查询一个根本不存在的数据&#xff0c; 缓存层和存储层都不会命中&#xff0c; 通常出于容错的考虑&#xff0c; 如果从存储 层查不到数据则不写入缓存层。 缓…

【深度学习】GPT-3,Language Models are Few-Shot Learners(一)

论文&#xff1a; https://arxiv.org/abs/2005.14165 摘要 最近的研究表明&#xff0c;通过在大规模文本语料库上进行预训练&#xff0c;然后在特定任务上进行微调&#xff0c;可以在许多NLP任务和基准上取得显著的进展。虽然这种方法在结构上通常是任务无关的&#xff0c;但…

国内外LabVIEW开发的区别

​分析国内外在LabVIEW开发中的差异需要从多个方面进行比较&#xff0c;包括界面设计、架构设计、注释与文档、调试方法、维护策略以及升级与迭代管理等。 界面设计&#xff1a; 国外的LabVIEW界面设计通常更加注重用户体验和视觉美观&#xff0c;使用现代化的控件和布局&…

基于ResNet-18的简单分类(新手,而且网络效果不咋滴,就是学个流程)

引言 先看问题&#xff1a; 我手边有一数据集&#xff0c;然后我想分分类&#xff01;~~ 咳咳&#xff0c;最近刚做了一个&#xff1a;训练集有1143张&#xff0c;分为5类&#xff0c;里面图片是打乱的。测试集有248张&#xff0c;想把它分分类看看咋样。 再看一下效果: …

mellanox HCA IB网卡固件更新

注意事项&#xff1a; 1.如果PSID以SGN开头&#xff0c;说明该产品是曙光的OEM产品&#xff0c;可以向HPC高速网络部获取固件。如果PSID以MT开头&#xff0c;说明该产品是Mellanox或nvidia的标准产品&#xff0c;可以通过官网下载固件。 2.通过官网获取固件&#xff0c;一定要…

Nginx缓存之web缓存配置

Web 缓存可节约网络带宽&#xff0c;有效提高用户打开网站的速度。由于应用服务器被请求次数的降低&#xff0c;也相对使它的稳定性得到了提升。Web 缓存从数据内容传输的方向分为前向位置缓存和反向位置缓存两类。如下图所示。 前向位置缓存既可以是用户的客户端浏览器&#x…

【免费API推荐】:轻松集成,为您的应用增添更多价值(9)

开发者喜爱的免费API是他们在开发过程中最宝贵的伙伴。这些API提供了丰富的功能和数据&#xff0c;帮助开发者构建出令人惊叹的应用。无论是地图服务、社交媒体集成、数据分析还是人工智能&#xff0c;这些免费API为开发者提供了强大的工具和资源&#xff0c;让他们能够更轻松地…

任务4.8.3 利用SparkSQL统计每日新增用户

实战概述&#xff1a;利用SparkSQL统计每日新增用户 任务背景 在大数据时代&#xff0c;快速准确地统计每日新增用户是数据分析和业务决策的重要部分。本任务旨在使用Apache SparkSQL处理用户访问历史数据&#xff0c;以统计每日新增用户数量。 任务目标 处理用户访问历史数…

兴业法拍网周报|在北京你是选择租房还是买房?(6.10-6.14)

西城区金融世家10号楼6单元801、803&#xff08;共两套&#xff09; 位置优越:金融世家所在区域位于国家政治中心和国家金融管理中心&#xff0c;是凝集国家“政经”的焦点。临近长安街、金融街、西二环交通动脉&#xff0c;道路通畅便捷&#xff0c;保值率高。 优质教资:附近…

Objective-C 学习笔记 | KVO(key-value obsereving)

Objective-C 学习笔记 | KVO&#xff08;key-value obsereving&#xff09; Objective-C 学习笔记 | KVO&#xff08;key-value obsereving&#xff09;使用 KVOKVO 的工作原理 Objective-C 学习笔记 | KVO&#xff08;key-value obsereving&#xff09; KVO 是指当指定的对象…

如何掌握 Java 中的国际化和本地化

随着全球化的发展&#xff0c;软件开发不仅要满足本地用户的需求&#xff0c;还要满足全球用户的需求。因此&#xff0c;软件的国际化&#xff08;Internationalization&#xff0c;I18N&#xff09;和本地化&#xff08;Localization&#xff0c;L10N&#xff09;显得尤为重要…

为什么网上这么多破解 Intellij IDEA 的工具,但是官方却不管呢?

大家好&#xff0c;我是小2&#xff0c;一个程序员~ 程序员小2 每天一篇技术重磅好文&#xff0c;涉及一线互联网大厂应用架构&#xff08;高可用、高性能、高稳定&#xff09;&#xff0c;AI、大数据、java架构等热门领域。 112篇原创内容 公众号 来源&#xff1a;Java知音…