代码随想录Day1 数组基础

news2025/2/27 15:01:09

本文详细说明和思路来源于: 

代码随想录

视频讲解:

手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili

Leetcode T 704

题目链接 704. 二分查找 - 力扣(LeetCode)

题目概述1:

 思路:

1.因为数组是升序排列,且数组的元素不重复,所以使用二分查找法

2.注意区间问题,判断条件是否能遍历所有下标.

写法1:在闭区间[left,right]中

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


        }
         return -1;
        
    }
   
}

写法2:在左闭右开区间[left,right)中

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

思考: 

第一次想到二分查找还可以按照区间来分

第一种:闭区间

假设在nums[7] = {1,3,5,7,9,11,13}中寻找target 7,取值下标范围是[0,6],因为是闭区间,所以right = nums.length - 1,因此left指针是0,right指针是6,这个时候left == right是有意义的,所以结束条件时left <= right,在进行if else判断之前,mid的值已经更新过了,此时进行+1或-1操作即可.

第二种:左闭右开区间

同样是上述条件,这里我们的right指针就得指向nums.length,也就是7,因为这里是开区间,

left == right 是没有意义的,例如判断到 [3,3) 这个时候就是矛盾的,既指向3又不指向3,所以判断条件就是 left < right,当nums[mid]<targrt的时候,也就是说,所求的值可能在mid的右边,所以left = mid + 1,而nums[mid]>target 的时候,就可能在左边,这个时候注意,是把left赋值为mid而不是mid-1,因为是开区间,mid指向的元素是不会参与下一轮循环的判断的.

注:这里的mid之所以取值是left+((right-left)>>1)而不是直接(right-left)>>1或者是(left+right)//2的原因是,因为(left+right)//2中left和right本身是两个int类型的变量,取值范围是-2147483648 ~ 2147483647,而如果出现两个很接近2147483647的数相加时,很容易出现负数;不使用

(right-left)>>1的原因是,本身这个是能表示left和right指针之间的距离的一半,并不能表示mid的下标,而用left加上距离的一半才更好的表示了mid的下标.

总结:

首先是,这题虽然一眼就能看出来使用二分法解决,但是在看到解法之前,我从来没有想过考虑边界的问题,只能举例去慢慢推导出边界,而且很容易犯一些低级错误.现在有所好转.

 题目概述2:

思路: 

这题一开始我已经忘记了,只记得在很久以前做过,是看完了卡哥的题解之后才豁然开朗,所以一道题还是得多刷多总结.

1.暴力求解

两层for循环,一层负责遍历数组,一层负责更新数组,由于数组的删除元素不是真正的删除,而是覆盖掉需要删除的元素,所以时间复杂度是O(n^2),因为一旦发现一个目标元素,就让数组目标元素后面的元素向前移动一位,然后让数组的大小-1.

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int size = nums.size();
        for (int i = 0; i < size; i++) {
            if (nums[i] == val) { // 发现需要移除的元素,就将数组集体向前移动一位
                for (int j = i + 1; j < size; j++) {
                    nums[j - 1] = nums[j];
                }
                i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
                size--; // 此时数组的大小-1
            }
        }
        return size;

    }
};

 

 2.快慢指针法

定义一个快指针fast负责寻找目标元素val,一个慢指针负责更新数组,当快指针找到目标元素,即nums[fast] == val,此时慢指针就停下来,直到快指针找到不等于目标值的元素,再对nums[slow] = nums[fast]进行赋值操作.

我们举一个例子:nums[6] = {1,2,3,6,3,9}目标值是3

一开始fast 和 slow指针都指向1,发现不相等,fast和slow都向前走,当指向下标2的时候,fast指针继续向前,slow指针停下,找到下标3发现不相等,就再执行一次赋值,然后两个指针一起向前走,依此往复,最后的数组大小其实就是slow指针指向的下标,因为slow指针再结束后还向后移动了一个单位.最后返回slow的下标即可.

这个解法的时间复杂度只有O(n),因为只遍历了一次数组.

class Solution {
    public int removeElement(int[] nums, int val) {
        int fast = 0;
        int slow = 0;
        for(int i = 0;i<nums.length;i++)
        {
             if(nums[fast] == val)
             {
                 fast++;
             }
             else
             {
                 nums[slow] = nums[fast];
                 fast++;
                 slow++;
             }
        }
        int t = slow;
        return t;

    }
}

 

总结:

需要多训练这种快慢指针解法,多练习,希望这次代码随想录各位都能坚持下去.

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

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

相关文章

Python 数据分析学习路线

Python 数据分析学习路线 第一阶段&#xff1a;Python语言基础第二阶段&#xff1a;数据采集和持久化第三阶段&#xff1a;数据分析第四阶段&#xff1a;数据挖掘与机器学习书籍介绍参与方式 第一阶段&#xff1a;Python语言基础 在学习数据分析之前&#xff0c;首先需要掌握P…

机器人还可以支持呼入?

呼入机器人是指一种能够接听电话并进行自动语音交互的人工智能软件系统。与传统的人工客服不同&#xff0c;呼入机器人可以根据预设的逻辑和语音识别技术进行自动回复和处理来电者的问题或需求&#xff0c;无需人工干预。这种软件通常能够帮助办公室工作人员更加高效地完成日常…

Ae 效果:CC Mr. Mercury

模拟/CC Mr. Mercury Simulation/CC Mr. Mercury CC Mr. Mercury&#xff08;CC 水银先生&#xff09;主要用于创建类似水银等液态金属或油漆等的动态效果。 CC Mr. Mercury 本质上模拟一个发射水银粒子的椭圆形发生器&#xff0c;基于源图像的像素创建自带动画的效果&#xff…

Flask 入门教程

文章目录 QuickStart1.安装2.flask 应用示例 开发1.路由&#xff08;Routing&#xff09;请求方法&#xff08;Http Method&#xff09;变量规则末尾正斜杠Url 构造 2.HTML渲染3.获取请求参数&#xff08;Accessing Request Data&#xff09;上下文局部变量请求对象&#xff08…

景联文科技牵头制定的《信息技术 可扩展的生物特征识别数据交换格式 第4部分:指纹图像数据》国家标准启动会暨研讨会在杭州顺利召开

2023年9月19日&#xff0c;由杭州景联文科技有限公司牵头制定的《信息技术 可扩展的生物特征识别数据交换格式 第4部分&#xff1a;指纹图像数据》国家标准启动会暨起草组工作会议在杭州顺利召开。 来自中国电子技术标准化研究院、熵基科技、名光微电子科技、广州麦仑信息科技等…

分享从零开始学习网络设备配置--任务3.4 利用单臂路由实现部门间网络互访

任务描述 某公司的管理员对部门划分了VLAN后&#xff0c;发现两个部门之间无法通信&#xff0c;但有时两个部门的员工需要进行通信&#xff0c;管理员现要通过简单的方法来实现此功能。划分VLAN之后&#xff0c; VLAN之间是不能通信的&#xff0c;使用路由器的单臂路由功能可以…

负载均衡中间件---Nginx

一.nginx的好处 学习 Nginx 对于一个全栈开发者来说是非常有价值的&#xff0c;下面是一些学习 Nginx 的原因和好处&#xff1a; 反向代理和负载均衡&#xff1a;Nginx 是一个高性能的反向代理服务器&#xff0c;可以用于将客户端请求转发给多个后端服务器&#xff0c;实现负…

Mysql和ES、Redis数据同步方案汇总

文章目录 前言 一、数据同步方案1.同步双写2.异步双写&#xff08;[MQ](https://so.csdn.net/so/search?qMQ&spm1001.2101.3001.7020)方式&#xff09;3.基于Mysql表定时扫描同步4.基于[Binlog](https://so.csdn.net/so/search?qBinlog&spm1001.2101.3001.7020)实时同…

MySQL常用配置详解

目录 一、MySQL 查看配置信息二、MySQL 查看服务器当前运行状态的信息三、MySQL 常用配置详解1、mysql&#xff08;使用mysql命令登录数据库时的默认的设置&#xff09;2、client &#xff08;客户端默认设置内容&#xff09;3、mysqld&#xff08;服务端端配置&#xff09; 四…

Elasticsearch 的页面工具kibana中 dev tool 菜单使用

首先来到kibana 页面&#xff0c;找到 dev tool 菜单&#xff0c;选择Console ​​​​​​es的页面工具kibana中 dev tool 菜单使用_kibana中的dev tools 在哪里_nandao158的博客-CSDN博客 1、查所有的索列表 GET /_cat/indices?v 或者 GET /_cat/indices 2、创建索引 PO…

【VSCode设置单个子文件时不要平级显示】

打开VSCode 的菜单 【文件】》【首选项】》【设置】&#xff0c;搜索输入【compact】&#xff0c;然后将 Explorer:Compact Folder的勾选去掉即可

Python数据容器——列表、元组、字符串、集合、字典

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 本文专栏&#xff1a;Python专栏 专栏介绍&#xff1a;本专栏为免费专栏&#xff0c;并且会持续更新python基础知识&#xff0c;欢迎各位订阅关注。 目录 一、了解数据容器 1. 为什么需要数据容器&#xff1f…

vscode在mac上保存项目文件提示保存失败

原因&#xff1a;可能是由于创建命令时使用“sudo xxxx” 解决办法&#xff1a; 进入访达–》选中简介–》打开锁–》选中自己用户–》输入密码–》结束 注意&#xff1a;由于这个设置只适用于本目录&#xff0c;内部目录还是有权限限制&#xff0c;解决办法点边上的小点–》…

Linux 文件 目录管理

Linux 文件 基本属性 Linux 系统是一种典型的多用户系统&#xff0c;为了保护系统的安全性&#xff0c;不同的用户拥有不同的地位和权限。Linux 系统对不同的用户访问同一文件&#xff08;包括目录文件&#xff09;的权限做了不同的规定。 可以使用命令&#xff1a;ll 或 ls –…

科目二倒车入库

调整座位和后视镜 离合踩到底大腿小腿成130-140 上半身90-100 座椅高度能看到前方全部情况 后视镜调节到能看到后门把手&#xff0c;且后门把手刚好在后视镜上方边缘、离车1/3处。 保持直线&#xff1a; 前进&#xff1a; 车仪表盘中央的原点和地面上的黄线擦边&#xff…

Android 10.0 系统开启和关闭黑白模式主题功能实现

1. 概述 在10.0的rom系统开发定制化中,在系统SystemUI的下拉状态栏中,产品开发功能需求要求添加黑白模式功能开关的功能,就是打开黑白模式,系统颜色就会变成黑白颜色, 关闭黑白模式开关系统就会变成彩色模式,所以就需要了解下系统是怎么设置黑白模式和彩色模式的,然后添…

现代循环神经网络-门控循环单元(GRU)

理论 门控隐状态 门控循环单元与普通的循环神经网络之间的关键区别在于&#xff1a; 前者支持隐状态的门控。 这意味着模型有专门的机制来确定应该何时更新隐状态&#xff0c; 以及应该何时重置隐状态。 这些机制是可学习的&#xff0c;并且能够解决了上面列出的问题。 例如&…

WPF 控件专题 RadioButton样式一

RadioButton样式示例 Style样式修改如下&#xff1a;通过改下RadioButton的ControlTemplate&#xff0c;修改控件所呈现的外观形状和颜色&#xff1b;通过IsChecked属性触发器样式变化。 <UserControl.Resources><Style x:Key"defaultRadioStyle" TargetT…

Ubuntu中安装Anaconda 如何将 路径导入为全局变量

第一步&#xff1a;将你的anaconda 路径复制下来&#xff0c;在终端输入对应路径。 echo export PATH"/home/你的用户名/anaconda3/bin:$PATH" >> ~/.bashrc 第二步&#xff1a;在终端输入下面命令或者重启系统。 source ~/.bashrc 在对应的anaconda安装目…

RocketMQ 发送事务消息

文章目录 事务的相关理论事务ACID特性CAP 理论BASE 理论 事务消息应用场景MQ 事务消息处理处理逻辑 RocketMQ 事务消息处理流程官网事务消息流程图 rocketmq-client-java 示例&#xff08;gRPC 协议&#xff09;创建事务主题生产者消费者 rocketmq-client 示例&#xff08;Remo…