数组:二分查找、移除数组等经典数组题

news2024/11/19 5:33:22

二分查找:

相关题目链接:https://leetcode.cn/problems/binary-search/

题目重现:

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

思路:

首先,要在n个升序整型数组nums中找到一个确定的值,我们首先想到的肯定是暴力求解:将数组中的每个元素都遍历一遍然后与目标值进行对比。但当n值很大且目标值不存在于数组中时,这个方法是非常不好的。

要想简单去解决这个问题,我们需要用到二分法

当然二分法是有使用前提的:

1.数组为有序数组

2.数组中无重复元素。

二分法有一个重难点,那就是如何确定区间

区间有:

[i,j) 左闭右开区间

(i,j] 左开右闭区间

[i,j] 左闭右闭区间

闭区间表示这个区间中包括这个数,开区间表示这个区间中不包括这个数。

举个例子:(2,5] 这个区间是左开右闭区间,在这个区间中,所有的整数有3,4,5。其中不包括2,而5是这个区间的边沿。

区分好各种区间应该包括哪些数,下面我们来说这道题的重点:二分法

顾名思义,二分法就是把当前的区间从中间分成两个部分,然后逐步细分直到我们得出我们想要的东西。

例如:当前我们有这样一个数组,我们想要找到5这个数字是否在数组中。

如果,当前中间数下标为i。

那么存在:

  • if(nums[i]==target) 表示,当前i下标的值就是要找的特定值。

  • if(nums[i] < target)表示,特定值只可能在当前i下标之后的区间中。

  • if(nums[i] > target)表示,特定值只可能在当前i下标之前的区间中

也就是说,我们首先在[left,right]这个区间中找特定值,在这个区间中,我们得到这个区间的中间下标与特定值进行对比,然后逐渐缩小我们要查找的区间,直到找到这个特定值,或查找区间为空。

代码:

class Solution {
    public int search(int[] nums, int target) {
        int left=0;
        int right=nums.length-1;
        while(left<=right){
            int mid=(right-left)/2+left;
            if(nums[mid]==target){
                return mid;
            }else if(nums[mid]<target){
                left=mid+1;
            } else if (nums[mid]>target) {
                right=mid-1;
            }
        }
        return -1;
    }
}

移除数组:

相关题目链接:https://leetcode.cn/problems/remove-element/

题目重现:

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

思路:

我们将这道题拆分下来也就是说,这道题我们要找到数值等于val的元素,然后移除它们,并返回数组的新长度。

要知道数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。

这里,我们可以使用双指针的方式:

  • 快指针:寻找新数组的元素 ,新数组中不含有目标元素。

  • 慢指针:指向更新,新数组下标的位置。

代码:

class Solution {
    public int removeElement(int[] nums, int val) {
        int s=0;
        for(int f=0;f<nums.length;f++){
            if(nums[f]!=val){
                nums[s]=nums[f];
                s++;
            }
        }
        return s;
    }
}

有序数组的平方:

相关题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/

题目重现:

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

思路:

我这里采用了暴力解法,也就是遍历数组中每一个元素,然后将其平方。最后将平方后的数组进行排序。当然这里也可以采用双指针的写法。

代码:

class Solution {
    public int[] sortedSquares(int[] nums) {
        int n=nums.length;
        int[] nums1=new int[n];
        for (int i = 0; i < n; i++) {
            nums1[i]=nums[i]*nums[i];
        }
        Arrays.sort(nums1);
        return nums1;
    }
}

长度最小的子数组:

相关题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/

题目重现:

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

思路:

这里可以采用暴力解法。也可以采用滑动窗口的解法。我这里采用了滑动窗口的解法。

滑动窗口也就是说:就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果

定义两个指针 start 和 end 分别表示子数组也就是滑动窗口的开始位置和结束位置

其次,我们需要一个变量 sum来存储子数组中的元素和

在初始状态下,start 和 end 都指向下标 0,sum的值为 0。

每一轮迭代,将 nums[end]加到 sum,如果 sum≥s,则更新子数组的最小长度,然后将 nums[start] 从 sum 中减去并将 start 右移,直到 sum<s,在此过程中同样更新子数组的最小长度。在每一轮迭代的最后,将 end 右移。

代码:

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
         int i=0;
        int n=nums.length;
        int sum=0;
        if(n==0){
            return 0;
        }
        int ans=Integer.MAX_VALUE;
        for (int j = 0; j <n; j++) {


            sum+=nums[j];
            while(sum>=target) {
                ans = Math.min(ans, j - i + 1);
                sum -= nums[i++];
            }
        }
        return ans == Integer.MAX_VALUE ? 0 : ans;
    }
}

螺旋矩阵Ⅱ:

相关题目链接:https://leetcode.cn/problems/spiral-matrix-ii/

题目重现:

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

思路:

这道题我们要明确:循环不变量原则

首先,我们模拟一下顺时针画矩阵的过程:

  • 填充上行从左到右

  • 填充右列从上到下

  • 填充下行从右到左

  • 填充左列从下到上

此时,我们发现,我们需要一圈一圈的循环,如果这个循环中不固定循环的规则的话,我们很有可能写着写着就懵逼了。

所以,这个时候,我们先确定一下循环的规则,在这里我确定的规则是:左闭右开

那么根据,这个规则,我们就可以很容易的写出循环代码了。

代码:

class Solution {
    public int[][] generateMatrix(int n) {
        int loop=0;
        int count=1;
        int[][] res=new int[n][n];
        int start=0;
        int i,j;


        while(loop++<n/2){
            for(j=start;j<n-loop;j++){
                res[start][j]=count++;
            }
            for(i=start;i<n-loop;i++){
                res[i][j]=count++;
            }
            for(;j>=loop;j--){
                res[i][j]=count++;
            }
            for(;i>=loop;i--) {
                res[i][j]=count++;
            }
            start++;
        }
        if(n%2==1){
            res[start][start]=count++;
        }
        return res;
    }
}

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

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

相关文章

【c++】文件操作(文本文件、二进制文件)

文章目录文件操作文本文件写文件读文件二进制文件写文件读文件文件操作 程序运行时产生的数据都属于临时数据&#xff0c;程序一旦运行结束都会被释放&#xff1b; 通过文件可以将数据持久化&#xff1b; c中对文件操作需要包含头文件 文件类型分为两种&#xff1a; 1、文本文…

Playbook的用法

目录 Playbook Playbook 与 Ad-Hoc 对比 YAML 语言特性 YAML语法简介 支持的数据类型 写法格式 1 scalar 标量 建议缩进两个空格&#xff0c;可多 2 Dictionary 字典 3 List 列表 三种常见的数据格式 Playbook 核心组件 不要用 tab 可以#注释 hosts remote_us…

【编程入门】应用市场(Python版)

背景 前面已输出多个系列&#xff1a; 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 《N种编程语言做个记事本》 目标 为编程初学者打造入门学习项目&#xff0c;使…

【Linux】进程间通信(匿名管道和命名管道通信、共享内存通信)

文章目录1、进程间通信1.1 进程的通信1.2 如何让进程间通信&#xff1f;1.3 进程间通信的本质2、管道通信2.1 匿名管道2.2 匿名管道通信2.3 命名管道2.4 命名管道的通信3、SystemV中的共享内存通信3.1 共享内存3.2 共享内存的通信3.3 共享内存的缺点以及数据保护3.4 共享内存的…

13.STM32超声波模块讲解与实战

目录 1.超声波模块讲解 2.超声波时序图 3.超声波测距步骤 4.项目实战 1.超声波模块讲解 超声波传感器模块上面通常有两个超声波元器件&#xff0c;一个用于发射&#xff0c;一个用于接收。电路板上有4个引脚&#xff1a;VCC GND Trig&#xff08;触发&#xff09;&#xff…

gcc的使用,调试工具gdb的使用

gcc编译 gcc编译可以分为四个步骤&#xff0c;预处理、编译、汇编、链接。 预处理命令&#xff1a;gcc -E hello.c -o hello.i编译命令&#xff1a;gcc -S hello.i -o hello.s汇编命令&#xff1a; gcc -c hello.s -o hello.o链接命令&#xff1a;gcc hello.o -o hello gcc…

一个.Net Core开发的,撑起月6亿PV开源监控解决方案

更多开源项目请查看&#xff1a;一个专注推荐.Net开源项目的榜单 项目发布后&#xff0c;对于我们程序员来说&#xff0c;项目还不是真正的结束&#xff0c;保证项目的稳定运行也是非常重要的&#xff0c;而对于服务器的监控&#xff0c;就是保证稳定运行的手段之一。对数据库、…

Navicat16实用小技巧

数据库管理工具是一种用于管理数据库的软件工具&#xff0c;它可以帮助用户创建、修改、维护和查询数据库。数据库管理工具可以为用户提供可视化界面&#xff0c;使得管理数据库变得更加容易。最为一款数据库管理工具&#xff0c;需要具备一下功能&#xff1a; 数据库创建和配…

OAK相机如何将yoloV6模型转换成blob格式?(2.0 及之后版本)

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 ▌前言 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是助手…

【对比学习论文】SimCLR 视觉表征对比学习的简单框架

文章题目&#xff1a;A Simple Framework for Contrastive Learning of Visual Representations时间&#xff1a;2020 摘要 本文提出了SimCLR:一种用于视觉表征对比学习的简单框架。我们简化了最近提出的对比自监督学习算法&#xff0c;而不需要专门的架构或内存库。为了了解…

websocket报错集锦-不断更新中

问题1&#xff1a;Failed to construct ‘WebSocket’: An insecure WebSocket connection may not be initiated from a page loaded over HTTPS. 问题描述 Mixed Content: The page at https://AAAAAA.com was loaded over HTTPS, but attempted to connect to the insecur…

Linux系统下命令行安装MySQL5.7+详细步骤

一起学编程&#xff0c;让生活更随和&#xff01; 如果你觉得是个同道中人&#xff0c;欢迎关注博主 gzh &#xff1a;【随和的皮蛋桑】。 专注于Java基础、进阶、面试以及计算机基础知识分享&#x1f433;。偶尔认知思考、日常水文&#x1f40c;。 目录1、下载安装包2、检查…

STM32 使用microros与ROS2通信

本文主要介绍如何在STM32中使用microros与ROS2进行通信&#xff0c;在ROS1中标准的库是rosserial,在ROS2中则是microros,目前网上的资料也有一部分了&#xff0c;但是都没有提供完整可验证的demo&#xff0c;本文将根据提供的demo一步步给大家进行演示。1、首先如果你用的不是S…

JUC 之 线程局部变量 ThreadLocal

—— ThreadLocal 基本概念 ThreadLocal 提供线程局部变量。这些变量与正常的变量不同&#xff0c;因为每一个线程在访问 ThreadLocal 实例的时候&#xff08;通过其get 或者 set 方法&#xff09;都有自己的、独立初始化的变副本。ThreadLocal实例通常是类中的私有静态字段&…

104-JVM优化

JVM优化为什么要学习JVM优化&#xff1a; 1&#xff1a;深入地理解 Java 这门语言 我们常用的布尔型 Boolean&#xff0c;我们都知道它有两个值&#xff0c;true 和 false&#xff0c;但你们知道其实在运行时&#xff0c;Java 虚拟机是 没有布尔型 Boolean 这种类型的&#x…

@Autowired和@Resource的区别

文章目录1. Autowired和Resource的区别2. 一个接口多个实现类的处理2.1 注入时候报错情况2.2 使用Primary注解处理2.3 使用Qualifer注解处理2.4 根据业务情况动态的决定注入哪个serviceImpl1. Autowired和Resource的区别 Aurowired是根据type来匹配&#xff1b;Resource可以根…

数据结构栈的经典OJ题【leetcode最小栈问题大剖析】【leetcode有效的括号问题大剖析】

目录 0.前言 1.最小栈 1.1 原题展示 1.2 思路分析 1.2.1 场景引入 1.2.2 思路 1.3 代码实现 1.3.1 最小栈的删除 1.3.2 最小栈的插入 1.3.3 获取栈顶元素 1.3.4 获取当前栈的最小值 2. 有效的括号 0.前言 本篇博客已经把两个关于栈的OJ题分块&#xff0c;可以根据目…

【蓝牙mesh】Upper协议层介绍

【蓝牙mesh】Upper协议层介绍 Upper层简介 Upper协议层用于处理网络层以上的功能&#xff0c;包括设备的应用层数据、安全、群组等信息&#xff0c;是实现蓝牙mesh应用功能的关键协议之一。Upper层接收来自Access层的数据或者是Upper层自己生成的Control数据&#xff0c;并且将…

typing库

typing 库 引入 在日常代码编写中&#xff0c;由于python语言特性&#xff0c;不用像go等编译性语言一样&#xff0c;在定义函数时就规范参数和放回值的类型。 def demo(a, b):return "ab" 此时 a 和 b 可以传入任意类型参数毫无疑问&#xff0c;这一特性&#…

漏洞分析: WSO2 API Manager 任意文件上传、远程代码执行漏洞

漏洞描述 某些WSO2产品允许不受限制地上传文件&#xff0c;从而执行远程代码。以WSO2 API Manager 为例&#xff0c;它是一个完全开源的 API 管理平台。它支持API设计&#xff0c;API发布&#xff0c;生命周期管理&#xff0c;应用程序开发&#xff0c;API安全性&#xff0c;速…