代码随想录算法训练营第1天(数组1)| 704. 二分查找、27. 移除元素、977.有序数组的平方

news2025/1/9 17:48:16

一、704 二分查找

题目:https://leetcode.cn/problems/binary-search/

视频:https://www.bilibili.com/video/BV1fA4y1o715

讲解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html

二分查找前提:有序,无重复

二分法区间有两种:左闭右闭 [left, right],左闭右开 [left, right)

这个题的关键是:边界的处理

三个变量:left, right,middle

需要注意:

1、while(left< or <= right)—>看是否合法

左闭右闭(<=) or 左闭右开(<),这两种方式怎么取值,主要取决于区间是否成立(把=单拎出来看情况是否合法)

[left, right] [3,3] 合法

[left, right) [3,3)不合法

2、if(nums[mid] > target) right=mid or right=mid-1 ---->看是否比较过

解法一:左闭右闭

class Solution {
    public int search(int[] nums, int target) {
        if(target < nums[0] || target > nums[nums.length-1]) return -1;

        int left = 0, right = nums.length-1;

        while(left <= right){
            int mid = left + ((right - left)>>1);   //
            if (target == nums[mid]) {
                return mid;
            } else if(target < nums[mid]){
                right = mid - 1;
            }else{
                left = mid +1;
            }
        }
        return -1;
    }
}

位运算

(right - left) >> 1:将当前搜索区间的长度除以2,得到中间位置距离left索引的距离。这里使用的是位运算符>>,它表示无符号右移1位,相当于除以2。使用位运算符可以提高计算效率。

left + ((right - left) >> 1):将left索引与中间位置距离相加,得到中间位置的索引值,即mid。

总结优先级顺序(从高到低):

  1. 乘法(*)和除法(/
  2. 左移(<<)和右移(>>
  3. 与(&)和异或(^
  4. 加法(+)和减法(-
  5. 或(|

使用括号(<font style="color:rgb(6, 6, 7);">()</font>)可以改变运算的优先级,使得括号内的运算优先执行。

尝试记录:

第 1 次:
class Solution {
    public int search(int[] nums, int target) {
        if(nums == null || nums.length == 0) return -1;    //1

        int left = 0;
        int right = nums.length - 1;
        int mid = (left + right)/2;    //2

        while(left <= right){
            if(nums[mid] == target){
                return mid;
            } else if(nums[mid] < target){
                left = mid + 1;
            } else {
                right = mid - 1;
            } 
        }
        return -1;
    }
}

结果:超时

问题:

1、开始的判空没必要,应该改成是: target 和有序数组首尾元素的判断,即比最小的小、比最大的大就不用判断了。

2、mid 写错位置,每次都有变化,应该写在循环里

第二次:
class Solution {
    public int search(int[] nums, int target) {
        // if(nums == null || nums.length == 0) return -1;
        if(target > nums[nums.length-1] || target < nums[0]) return -1;

        int left = 0;
        int right = nums.length - 1;
        

        while(left <= right){
            int mid = (left + right)/2;
            if(nums[mid] == target){
                return mid;
            } else if(nums[mid] < target){
                left = mid + 1;
            } else {
                right = mid - 1;
            } 
        }
        return -1;
    }
}
改进

加入位运算

class Solution {
    public int search(int[] nums, int target) {
        if(target < nums[0] || target > nums[nums.length-1]) return -1;

        int left = 0, right = nums.length-1;

        while(left <= right){
            int mid = left + ((right - left)>>1);
            if (target == nums[mid]) {
                return mid;
            } else if(target < nums[mid]){
                right = mid - 1;
            }else{
                left = mid +1;
            }
        }
        return -1;
    }
}

解法二:左闭右开

class Solution {
    public int search(int[] nums, int target) {
        if(target < nums[0] || target > nums[nums.length-1]) return -1;

        int left = 0, right = nums.length-1;

        while(left < right){        //
            int mid = left + ((right - left)>>1);
            if (target == nums[mid]) {
                return mid;
            } else if(target < nums[mid]){
                right = mid;
            }else{
                left = mid +1;    //
            }
        }
        return -1;
    }
}

二、27 移除元素

题目:https://leetcode.cn/problems/remove-element/

视频:https://www.bilibili.com/video/BV12A4y1Z7LP

讲解:https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html

双指针思想(一层 for 循环解决)

快指针+慢指针

快指针所指向的数组元素如果不等于 val -》把快指针指向的值赋给慢指针指向的值,之后慢指针往后一位

快指针所指向的数组元素等于 val-》不走 if,fast 直接后移

快指针带动慢指针走:快指针动了,把值赋给慢指针,慢指针后移

在原数组上修改(覆盖)

class Solution {
    public int removeElement(int[] nums, int val) {
        int slow=0;

        for(int fast = 0; fast < nums.length; fast++){
            if(nums[fast] != val){
                nums[slow++] = nums[fast];
            }
        }
        return slow;      
    }
}

三、977.有序数组的平方

题目:https://leetcode.cn/problems/squares-of-a-sorted-array/

视频:https://www.bilibili.com/video/BV1QB4y1D7ep

讲解:https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html

双指针

慢指针在左边界,快指针在右边界,平方放到新数组中

慢指针对应元素的平方大-》慢指针平方放到新数组中,慢指针后移

快指针对应元素的平方大-》快指针平方放到新数组中,快指针前移

class Solution {
    public int[] sortedSquares(int[] nums) {
        int[] result = new int[nums.length];
        int k = result.length-1;

        for(int fast=nums.length-1, slow=0; fast>=slow; ){
            if(nums[slow]*nums[slow]>nums[fast]*nums[fast]){
                result[k--] = nums[slow]*nums[slow];
                slow++;
            }else {
                result[k--] = nums[fast]*nums[fast];
                fast--;
            }
        }
        return result;
    }
}

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

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

相关文章

【Redis源码】 RedisObject结构体

【Redis源码】 RedisObject结构体 文章目录 【Redis源码】 RedisObject结构体概要1. redis object 由来2. 通过汇编代码分析3. 总结 概要 博主这里从redis object由来&#xff0c;和从底层内存分配角度进行讲解哦&#xff0c;小伙伴们自行选择读取 1. redis object 由来 ​ …

Ungoogled Chromium127 编译指南 MacOS 篇(二)- 项目要求

1. 引言 在开始编译 Ungoogled Chromium 之前&#xff0c;我们需要确保系统满足所有必要的硬件和软件要求。由于浏览器编译是一个资源密集型的任务&#xff0c;合适的硬件配置和完整的软件环境至关重要。本文将详细介绍编译 Ungoogled Chromium 所需的各项要求。 2. 硬件要求…

专家混合(MoE)大语言模型:免费的嵌入模型新宠

专家混合&#xff08;MoE&#xff09;大语言模型&#xff1a;免费的嵌入模型新宠 今天&#xff0c;我们深入探讨一种备受瞩目的架构——专家混合&#xff08;Mixture-of-Experts&#xff0c;MoE&#xff09;大语言模型&#xff0c;它在嵌入模型领域展现出了独特的魅力。 一、M…

【Golang 面试题】每日 3 题(二十四)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

TCP Analysis Flags 之 TCP Retransmission

前言 默认情况下&#xff0c;Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态&#xff0c;并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时&#xff0c;会对每个 TCP 数据包进行一次分析&#xff0c;数据包按照它们在数据包列表中出现的顺序进行处理。可…

Docker 使用Dockerfile创建镜像

创建并且生成镜像 在当前目录下创建一个名为Dockerfile文件 vi Dockerfile填入下面配置 # 使用 CentOS 作为基础镜像 FROM centos:7# 设置工作目录 WORKDIR /app# 复制项目文件到容器中 COPY bin/ /app/bin/ COPY config/ /app/config/ COPY lib/ /app/lib/ COPY plugin/ /a…

Matlab 数据处理与可视化的多元拓展应用(具体代码分析)

一、代码整体功能概述&#xff1a; 该代码主要实现了以下几个功能&#xff1a; 从文件&#xff08;part1.txt&#xff09;中读取数据&#xff0c;并提取第二列数据&#xff0c;将其存储在 originalColumnData 中。对原始数据进行可视化&#xff0c;包括绘制置零前数据的折线图…

Oracle OCP考试常见问题之线上考试流程

首先要注意的是&#xff1a;虽然Oracle官方在国际上取消了获得OCP认证需要培训记录的要求&#xff0c;但在中国区&#xff0c;考生仍然需要参加Oracle的官方或者其合作伙伴组织的培训&#xff0c;并且由Oracle授权培训中心向Oracle提交学员培训记录。考生只有在完成培训并通过考…

第2章 市场走势的分类与组合

本章主要讨论市场中走势的分类与组合&#xff0c;从基本假设出发&#xff0c;对市场的走势状态进行分类&#xff0c;探讨不同的走势组合和走势组合分类&#xff0c;以深刻理解走势。 2.1 走势分类 根据第一章市场的基本假设三&#xff0c;走势包含无序运动状态&#xff08;混…

【Excel/WPS】根据平均值,生成两列/多列指定范围的随机数/随机凑出两列数据

原理就是通过随机生成函数和平均值函数。 适用场景&#xff1a;在总体打分后&#xff0c;需要在小项中随机生成小分数 第一列&#xff1a;固定的平均值A2第二列&#xff1a; RANDBETWEEN(A2-10,A210)第三列&#xff1a;根据第二列用平均值函数算除 A2*2-B2这是随机值1的公式&am…

STM32裸机开发转FreeRTOS教程

目录 1. 简介2. RTOS设置&#xff08;1&#xff09;分配内存&#xff08;2&#xff09;查看任务剩余空间&#xff08;3&#xff09;使用osDelay 3. 队列的使用&#xff08;1&#xff09;创建队列&#xff08;1&#xff09;直接传值和指针传值&#xff08;2&#xff09;发送/接收…

Golang的网络安全漏洞检测

Golang的网络安全漏洞检测 一、网络安全意识的重要性 在当今网络高度发达的环境下&#xff0c;网络安全问题变得异常突出。黑客利用各种手段对网络系统进行攻击&#xff0c;企图窃取数据、篡改信息、瘫痪服务等&#xff0c;因此网络安全成为全球关注的焦点。在这种环境下&#…

oscp备考 oscp系列——Kioptix Level 1靶场 古老的 Apache Vuln

目录 前言 1. 主机发现 2. 端口扫描 3. 指纹识别 4. 目录扫描 5. 漏洞搜索和利用 前言 oscp备考&#xff0c;oscp系列——Kioptix Level 1靶场 Kioptix Level 1难度为简单靶场&#xff0c;主要考察 nmap的使用已经是否会看输出&#xff0c;以及是否会通过应用查找对应漏…

git的rebase和merge的区别?

B分支从A分支拉出 1.git merge 处于A分支执行&#xff0c;git merge B分支:相当于将commit X、commit Y两次提交&#xff0c;作为了新的commit Z提交到了A分支上。能溯源它真正提交的信息。 2.git rebase 处于B分支&#xff0c;执行git rebase A分支&#xff0c;B分支那边复…

ansible-性能优化

一. 简述&#xff1a; 搞过运维自动化工具的人&#xff0c;肯定会发现很多运维伙伴们经常用saltstack和ansible做比较&#xff0c;单从执行效率上来说&#xff0c;ansible确实比不上saltstack(ansible使用的是ssh,salt使用的是zeromq消息队列[暂没深入了解])&#xff0c;但其实…

Pytest钩子函数,测试框架动态切换测试环境

在软件测试中&#xff0c;测试环境的切换是个令人头疼的问题。不同环境的配置不同&#xff0c;如何高效切换测试环境成为许多测试开发人员关注的重点。你是否希望在运行测试用例时&#xff0c;能够动态选择测试环境&#xff0c;而不是繁琐地手动修改配置&#xff1f; Pytest 测…

【RK3568笔记】Android修改开机动画

概述 Android 的开机动画是由一系列连续的 PNG 图片作为帧组成的动画形式&#xff0c;不是一张 GIF 图片。将各帧 PNG 图片以压缩方式进行保存&#xff08;压缩方式要求是存储压缩&#xff09;&#xff0c;并将保存的文件名命名为 bootanimation.zip&#xff0c;这个 bootanim…

华为路由器、交换机、AC、新版本开局远程登录那些坑(Telnet、SSH/HTTP避坑指南)

关于华为设备远程登录配置开启的通用习惯1、HTTP/HTTPS相关服务 http secure-server enablehttp server enable 2、Telnet服务telnet server enable3、SSH服务stelnet server enablessh user admin authentication-type password 「模拟器、工具合集」复制整段内容 链接&…

spring boot学习第二十三篇:Spring Boot集成RocketMQ

前置条件先安装好RocketMQ 希望在Window10安装rocketMQ并简单使用&#xff0c;可以参考如下文章&#xff1a; Window10安装rocketMQ并简单使用-CSDN博客 1、pom.xml文件里面加上依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId&…

花生好坏缺陷识别数据集,7262张图片,支持yolo,coco json,pasical voc xml格式的标注,识别准确率在95.7%

花生好坏缺陷识别数据集,7262张图片&#xff0c;支持yolo&#xff0c;coco json&#xff0c;pasical voc xml格式的标注&#xff0c;识别准确率在95.7% 数据集分割 训练组87&#xff05; 6353图片 有效集8% 606图片 测试集4% 303图片 预处理 自动定…