代码随想录二刷DAY1~3

Day1

704 二分查找,简单

我也有自己写题解的能力了,而且思维很清晰:

找什么就在if里写什么。

  1. class Solution {
  2. public:
  3.     int search(vector<int>& nums, int target) {
  4.         int l=0,r=nums.size()-1;
  5.         while(l<r){
  6.             int mid=l+r>>1;
  7.             if(nums[mid]<target){
  8.                 l=mid+1;
  9.             }
  10.             else{
  11.                 r=mid;
  12.             }
  13.         }
  14.         if(nums[l]==target) return l;
  15.         return -1;
  16.     }
  17. };

  1. class Solution {
  2. public:
  3.     int search(vector<int>& nums, int target) {
  4.         int l=0,r=nums.size()-1;
  5.         while(l<r){
  6.             int mid=(l+r+1)>>1;
  7.             if(nums[mid]>target){
  8.                 r=mid-1;
  9.             }
  10.             else{
  11.                 l=mid;
  12.             }
  13.         }
  14.         if(nums[l]==target) return l;
  15.         return -1;
  16.     }
  17. };

35 搜索插入的位置,简单

自己想的:找右边界,代码比之前的简洁很多:

  1. class Solution {
  2. public:
  3.     int searchInsert(vector<int>& nums, int target) {
  4.         int l=0,r=nums.size()-1;
  5.         while(l<r){
  6.             int mid=(l+r+1)>>1;
  7.             if(nums[mid]>target) r=mid-1;
  8.             else l=mid;
  9.         }
  10.         if(nums[l]<target) return l+1;
  11.         return l;
  12.     }
  13. };

34 排序数组中查找元素的第一个和最后一个位置,中等

哇神呀,自己写的:

Line 1037: Char 9: runtime error: reference binding to null pointer of type 'int' (stl_vector.h)是空指针访问,注意检查nums.size()==0

  1. class Solution {
  2. private:
  3.     int get_left(vector<int>&nums,int target){
  4.         int l=0,r=nums.size()-1;
  5.         while(l<r){
  6.             int mid=l+r>>1;
  7.             if(nums[mid]<target) l=mid+1;
  8.             else r=mid;
  9.         }
  10.         if(nums[l]==target) return l;
  11.         return -1;
  12.     }
  13.     int get_right(vector<int>&nums,int target){
  14.         int l=0,r=nums.size()-1;
  15.         while(l<r){
  16.             int mid=(l+r+1)>>1;
  17.             if(nums[mid]>target) r=mid-1;
  18.             else l=mid;
  19.         }
  20.         if(nums[l]==target) return l;
  21.         return -1;
  22.     }
  23. public:
  24.     vector<intsearchRange(vector<int>& nums, int target) {
  25.         if(nums.size()==0return {-1,-1};
  26.         int low=get_left(nums,target);
  27.         int high=get_right(nums,target);
  28.         return {low,high};
  29.     }
  30. };

27 移除元素,简单

快慢双指针入门。

  1. class Solution {
  2. public:
  3.     int removeElement(vector<int>& nums, int val) {
  4.         // i slow
  5.         // j fast
  6.         int i=0;
  7.         for(int j=0;j<nums.size();j++){
  8.             while(j<nums.size()&&nums[j]!=val)
  9.                 nums[i++]=nums[j++];
  10.             while(j<nums.size()&&nums[j]!=val)
  11.                 j++;
  12.         }
  13.         return i;
  14.     }
  15. };

其实第二句while写错了,但是竟然通过了。说明第二句while根本就没有执行!

性能很差,让我们优化一下:

直接删除第二句while就好了!因为nums[j]==val的话 根本不会进入while,交给for里面的j++来处理就好了:

  1. class Solution {
  2. public:
  3.     int removeElement(vector<int>& nums, int val) {
  4.         // i slow
  5.         // j fast
  6.         int i=0;
  7.         for(int j=0;j<nums.size();j++){
  8.             while(j<nums.size()&&nums[j]!=val)
  9.                 nums[i++]=nums[j++];
  10.         }
  11.         return i;
  12.     }
  13. };

DAY2

977 有序数组的平方,简单

  1. class Solution {
  2. public:
  3.     vector<intsortedSquares(vector<int>& nums) {
  4.         for(auto &n:nums) n*=n;
  5.         sort(nums.begin(),nums.end());
  6.         return nums;
  7.     }
  8. };

没什么好说的。

209 长度最小的子数组,中等

最短连续子数组问题,滑动窗口。

怎么就一直学不会滑动窗口呢。。。

没做出来,发现问题了,滑动的应当是右指针for()里面填,这样一来,sum的初始化应当放到for的外面。Res的更新语句放的位置也有问题。我刚开始想错了,应当是:

//最短,一发现符合,就缩

//如果是最长,一发现不符合,就扩

很有收获。

  1. class Solution {
  2. public:
  3.     int minSubArrayLen(int target, vector<int>& nums) {
  4.         int bestres = INT_MAX, l = 0, tmpres = 0;
  5.         int sum=0;
  6.         for (int r = 0; r < nums.size(); r++) {
  7.             sum += nums[r];
  8.             // 最短,一发现符合,就缩
  9.             // 如果是最长,一发现不符合,就扩
  10.             while (sum >= target) {
  11.                 tmpres = r - l + 1;
  12.                 bestres = min(tmpres, bestres);
  13.                 sum -= nums[l++];
  14.             }
  15.         }
  16.         if(bestres==INT_MAX) return 0;
  17.         return bestres;
  18.     }
  19. };

59 螺旋矩阵II,中等

不行呀,还是卡住了。

忘记更新x,y了。并且:走过了 !=0 那么就要更新偏移量。

  1. class Solution {
  2. public:
  3.     vector<vector<int>> generateMatrix(int n) {
  4.         vector<vector<int>> res(n,vector<int>(n,0));
  5.         int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
  6.         for(int x=0,y=0,d=0,k=1;k<=n*n;k++){
  7.             //走过了或者撞墙
  8.             res[x][y]=k;
  9.             int a=x+dx[d],b=y+dy[d];
  10.             if(a<0||a>n-1||b<0||b>n-1||res[a][b]!=0){
  11.                 d=(d+1)%4;
  12.                 a=x+dx[d];
  13.                 b=y+dy[d];
  14.             }
  15.             //更新x,y!!
  16.             x=a,y=b;
  17.         }
  18.         return res;
  19.     }
  20. };

DAY3

203移除链表元素,简单

Runtime error;因为缺少了一个更新当前指针的语句

  1. /**
  2.  * Definition for singly-linked list.
  3.  * struct ListNode {
  4.  *     int val;
  5.  *     ListNode *next;
  6.  *     ListNode() : val(0), next(nullptr) {}
  7.  *     ListNode(int x) : val(x), next(nullptr) {}
  8.  *     ListNode(int x, ListNode *next) : val(x), next(next) {}
  9.  * };
  10.  */
  11. class Solution {
  12. public:
  13.     ListNode* removeElements(ListNode* head, int val) {
  14.         if(head==nullptr) return head;
  15.         ListNode* dummyhead=new ListNode(0);
  16.         dummyhead->next=head;
  17.         ListNode* p=dummyhead;
  18.         //缺少一个更新指针的语句!
  19.         while(p->next!=nullptr){
  20.             if(p->next->val==val) p->next=p->next->next;
  21.             else p=p->next;
  22.         }
  23.         return dummyhead->next;
  24.     }
  25. };

ACWING29 删除链表中重复的节点

因为是排序的链表,那么只用针对连续情况去做判断和处理。

只要指针右移了,而且要访问其val或者next,则使用前必须判空(判自己,而不是next),否则会造成段错误。

题面:在一个排序的链表中,存在重复的节点,请删除该链表中重复的节点,重复的节点不保留。

这题有难度,要求重复的节点不保留,显然需要三指针了。

  1. /**
  2.  * Definition for singly-linked list.
  3.  * struct ListNode {
  4.  *     int val;
  5.  *     ListNode *next;
  6.  *     ListNode(int x) : val(x), next(NULL) {}
  7.  * };
  8.  */
  9. class Solution {
  10. public:
  11.     ListNode* deleteDuplication(ListNode* head) {
  12.         if(head==nullptrreturn head;
  13.         auto dummy= new ListNode(-1);
  14.         dummy->next=head;
  15.         auto p=dummy;
  16.         auto t=head;
  17.         auto q=head->next;
  18.         while(q!=nullptr){
  19.             while(q!=nullptr&&q->val!=t->val){
  20.                 p=t;
  21.                 t=q;
  22.                 q=q->next;
  23.             }
  24.             if(q==nullptrbreak;
  25.             while(q!=nullptr&&q->val==t->val){
  26.                 q=q->next;
  27.             }
  28.             p->next=q;
  29.             t=q;
  30.             if(q!=nullptr)q=q->next;
  31.         }
  32.   return dummy->next;
  33.     }
  34. };

206反转链表,简单

迭代法和递归法都思路不清晰或者说没思路!重新学咯:

代码随想录

迭代法和递归法。

迭代法:

  1. /**
  2.  * Definition for singly-linked list.
  3.  * struct ListNode {
  4.  *     int val;
  5.  *     ListNode *next;
  6.  *     ListNode() : val(0), next(nullptr) {}
  7.  *     ListNode(int x) : val(x), next(nullptr) {}
  8.  *     ListNode(int x, ListNode *next) : val(x), next(next) {}
  9.  * };
  10.  */
  11. class Solution {
  12. public:
  13.     ListNode* reverseList(ListNode* head) {
  14.         if(head==nullptrreturn head;
  15.         //这句初始化很重要,我们要让反转后的最后一个元素指向nullptr,那么head的pre自然应该初始化为nullptr
  16.         ListNode* pre=nullptr;
  17.         ListNode* cur=head;
  18.         //条件也重要呀,不用判它的next,手写模拟就知道了。
  19.         while(cur!=nullptr){
  20.             ListNode* tmp=cur->next;
  21.             cur->next=pre;
  22.             pre=cur;
  23.             cur=tmp;
  24.         }
  25.         //return 的是什么?好好想想 当然是pre
  26.         return pre;
  27.     }
  28. };

递归法:想不出来呀。

太抽象了,不管了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络】已解决:“‘ping‘ 不是内部或外部命令,也不是可运行的程序或批处理文件”报错

文章目录 一、问题分析背景二、可能出错的原因三、错误代码示例四、正确解决方法与示例五、注意事项 已解决“‘ping’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件”报错 一、问题分析背景 在Windows操作系统中&#xff0c;ping 命令是一个常用的网络诊断…

动态规划的递归写法和递推写法详解

目录 动态规划的概念 动态规划的递归写法 动态规划的递推写法 动态规划的概念 动态规划是一种用来解决一类最优化问题的算法思想。简单来说&#xff0c;动态规划将一个复杂的问题分解成若干个子问题&#xff0c;通过综合子问题的最优解来得到原问题的最优解。需要注意的是&…

【stm32-新建工程】

stm32-新建工程 ■ 下载相关STM32Cube官方固件包&#xff08;F1&#xff0c;F4&#xff0c;F7&#xff0c;H7&#xff09;■ 1. ST官方搜索STM32Cube■ 2. 搜索 STM32Cube■ 3. 点击获取软件■ 4. 选择对应的版本下载■ 5. 输入账号信息■ 6. 出现下载弹框&#xff0c;等待下载…

Codeforces Round 953 (Div. 2)(A~D题解)

这次比赛是我最顺利的一次比赛&#xff0c;也是成功在中途打进前1500&#xff0c;写完第三道题的时候也是保持在1600左右&#xff0c;但是后面就啥都不会了&#xff0c;还吃了点罚时&#xff0c;虽说如此也算是看到进步了&#xff0c;D题学长说很简单&#xff0c;但是我当时分析…

如何实现“变”CF而不变有效值

存在一些特殊需求,需要在保证有效值不变的情况下,“改变”正弦波的峰值因数(CF),如图,由绿色波形变为灰色波形: 正常的正弦波为 f ( t ) = 2 A ⋅ s i n ( 2 π T t ) f(t)=\sqrt{2}A\cdot sin(\frac{2\pi}{T}t) f(t)=2 ​A⋅sin(T2π​t) ,CF值为 2 \sqrt{2} 2 ​ …

Vue路由守卫的使用

示例如下&#xff1a;&#xff08;第一张图&#xff09;当你点击车1的时候你写了路由守卫就点不开出现无权访问 &#xff08;第二张图&#xff0c;就是可以访问后的图&#xff09;有路由守卫点不开的情况下当你在本地存储中写了你在路由守卫中写的东西就可以进入了 你需要在r…

[文献解读]:斯坦福最新研究-HumanPlus:人形机器人跟踪和模仿人类

摘要 制造具有与人类相似外形的机器人的关键论点之一是&#xff0c;我们可以利用大量人类数据进行训练。然而&#xff0c;由于人形机器人感知和控制的复杂性、人形机器人与人类在形态和驱动方面仍然存在的物理差距&#xff0c;以及人形机器人缺乏从自我中心视觉学习自主技能的…

基于STM32和人工智能的自动驾驶小车系统

目录 引言环境准备自动驾驶小车系统基础代码实现&#xff1a;实现自动驾驶小车系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景&#xff1a;自动驾驶应用与优化问题解决方案与优化收尾与总结 1. 引言 随着人工智能和嵌入式系统技术的…

Oracle--存储结构

总览 一、逻辑存储结构 二、物理存储结构 1.数据文件 2.控制文件 3.日志文件 4.服务器参数文件 5.密码文件 总览 一、逻辑存储结构 数据块是Oracle逻辑存储结构中的最小的逻辑单位&#xff0c;一个数据库块对应一个或者多个物理块&#xff0c;大小由参数DB_BLOCK_SIZE决…

一段代码读取Chrome存储的所有账号密码和Cookie

先写结论&#xff1a; Chrome密码管理里的账号密码&#xff0c;还有Cookie&#xff0c;安全性并不算太高&#xff0c;一段代码就可以自动读取并上报到其它地方。 尤其是国内用户大多喜欢破解软件&#xff0c;这些软件只要注入这样一段代码&#xff0c;就无声无息的把你的所有账…

KT-H6测距模块标品,测距范围1500m,demo报价1000RMB,批量报价500RMB

激光测距传感器是一种用于测量距离的模块,通常由传感器和相关电子设备组成,测距模块可以集成到各种设备和系统中,以实现准确的测距和定位功能。KT-H6系列激光测距模块,为自主研发,激光波长905nm的激光器,专为热成像、夜视仪、无人机、安防、瞄具等产品定身打造,其优点是…

算法与数据结构--决策树算法

欢迎来到 Papicatch的博客 文章目录 &#x1f349;决策树算法介绍 &#x1f348;原理 &#x1f348;核心思想包括 &#x1f34d;递归分割 &#x1f34d;选择标准 &#x1f34d;剪枝 &#x1f348;解题过程 &#x1f34d;数据准备 &#x1f34d;选择最佳分割特征 &…

分类模型部署-ONNX

分类模型部署-ONNX 0 引入&#xff1a;1 模型部署实战测试&#xff1a;1 安装配置环境&#xff1a;2 Pytorch图像分类模型转ONNX-ImageNet1000类3 推理引擎ONNX Runtime部署-预测单张图像&#xff1a; 2 扩展阅读参考 0 引入&#xff1a; 在软件工程中&#xff0c;部署指把开发…

消息队列-RabbitMQ-延时队列实现

死信队列 DLX,全称为Dead-Letter-Exchange,死信交换机&#xff0c;死信邮箱。当消息在一个队列中变成死信之后&#xff0c;它能重新发送到另外一个交换器中&#xff0c;这个交换器就是DLX&#xff0c;绑定DLX的队列就称为死信队列。 导致死信的几种原因&#xff1a; ● 消息…

Swift开发——简单函数实例

函数是模块化编程的基本单位,将一组完成特定功能的代码“独立”地组成一个执行单位,称为函数。函数的基本结构如下所示: 其中,func为定义函数的关键字;“函数名”是调用函数的入口;每个函数可以有多个参数,即可以有多个“参数标签 参数名称:参数类型”,一般地,各个参…

边缘微型AI的宿主?—— RISC-V芯片

一、RISC-V技术 RISC-V&#xff08;发音为 "risk-five"&#xff09;是一种基于精简指令集计算&#xff08;RISC&#xff09;原则的开放源代码指令集架构&#xff08;ISA&#xff09;。它由加州大学伯克利分校在2010年首次发布&#xff0c;并迅速获得了全球学术界和工…

跟着刘二大人学pytorch(第---13---节课之RNN高级篇)

文章目录 0 前言0.1 课程视频链接&#xff1a;0.2 课件下载地址&#xff1a; 1 本节课任务描述模型的处理过程训练循环初始化分类器是否使用GPU构造损失函数和优化器每个epoch所要花费的时间遍历每个epoch时进行训练和测试记录每次测试的准确率加入到列表中 具体实现&#xff0…

中国最著名的起名大师颜廷利:父亲节与之相关的真实含义

今天是2024年6月16日&#xff0c;这一天被广泛庆祝为“父亲节”。在汉语中&#xff0c;“父亲”这一角色常以“爸爸”、“大大”&#xff08;da-da&#xff09;或“爹爹”等词汇表达。有趣的是&#xff0c;“爸爸”在汉语拼音中表示为“ba-ba”&#xff0c;而当我们稍微改变“b…

DeepDriving | 经典的目标检测算法:CenterNet

本文来源公众号“DeepDriving”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;经典的目标检测算法&#xff1a;CenterNet 1 前言 CenterNet是2019年发表的一篇文章《Objects as Points》中提出的一个经典的目标检测算法&#xf…

MySQL-创建表~数据类型

070-创建表 create table t_user(no int,name varchar(20),gender char(1) default 男);071-插入数据 语法格式&#xff1a; insert into 表名(字段名1, 字段名2, 字段名3,......) values (值1,值2,值3,......);insert into t_user(no, name, gender) values(1, Cupid, 男);字…