代码随想录二刷DAY1~3

2024-06-17 05:36
文章标签 随想录 代码 二刷 day1

本文主要是介绍代码随想录二刷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. };

递归法:想不出来呀。

太抽象了,不管了。

这篇关于代码随想录二刷DAY1~3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068601

相关文章

随想录 Day 69 并查集 107. 寻找存在的路径

随想录 Day 69 并查集 107. 寻找存在的路径 理论基础 int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好vector<int> father = vector<int> (n, 0); // C++里的一种数组结构// 并查集初始化void init() {for (int i = 0; i < n; ++i) {father[i] = i;}

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

公共筛选组件(二次封装antd)支持代码提示

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件 使用到的库 npm i antdnpm i lodash-esnpm i @types/lodash-es -D /components/CommonSearch index.tsx import React from 'react';import { Button, Card, Form } from 'antd'

17.用300行代码手写初体验Spring V1.0版本

1.1.课程目标 1、了解看源码最有效的方式,先猜测后验证,不要一开始就去调试代码。 2、浓缩就是精华,用 300行最简洁的代码 提炼Spring的基本设计思想。 3、掌握Spring框架的基本脉络。 1.2.内容定位 1、 具有1年以上的SpringMVC使用经验。 2、 希望深入了解Spring源码的人群,对 Spring有一个整体的宏观感受。 3、 全程手写实现SpringM

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

记录AS混淆代码模板

开启混淆得先在build.gradle文件中把 minifyEnabled false改成true,以及shrinkResources true//去除无用的resource文件 这些是写在proguard-rules.pro文件内的 指定代码的压缩级别 -optimizationpasses 5 包明不混合大小写 -dontusemixedcaseclassnames 不去忽略非公共

麻了!一觉醒来,代码全挂了。。

作为⼀名程序员,相信大家平时都有代码托管的需求。 相信有不少同学或者团队都习惯把自己的代码托管到GitHub平台上。 但是GitHub大家知道,经常在访问速度这方面并不是很快,有时候因为网络问题甚至根本连网站都打不开了,所以导致使用体验并不友好。 经常一觉醒来,居然发现我竟然看不到我自己上传的代码了。。 那在国内,除了GitHub,另外还有一个比较常用的Gitee平台也可以用于

众所周知,配置即代码≠基础设置即代码

​前段时间翻到几条留言,问: “配置即代码和基础设施即代码一样吗?” “配置即代码是什么?怎么都是基础设施即代码?” 我们都是知道,DevOp的快速发展,让服务器管理与配置的时间大大减少,配置即代码和基础设施即代码作为DevOps的重要实践,在其中起到了关键性作用。 不少人将二者看作是一件事,配置即大代码是关于管理特定的应用程序配置设置本身,而基础设施即代码更关注的是部署支持应用程序环境所需的

53、Flink Interval Join 代码示例

1、概述 interval Join 默认会根据 keyBy 的条件进行 Join 此时为 Inner Join; interval Join 算子的水位线会取两条流中水位线的最小值; interval Join 迟到数据的判定是以 interval Join 算子的水位线为基准; interval Join 可以分别输出两条流中迟到的数据-[sideOutputLeftLateData,

Git代码管理的常用操作

在VS022中,Git的管理要先建立本地或远程仓库,然后commit到本地,最后push到远程代码库。 或者不建立本地的情况,直接拉取已有的远程代码。 Git是一个分布式版本控制系统,用于跟踪和管理文件的变化。它可以记录文件的修改历史,并且可以轻松地回滚到任何历史版本。 Git的基本概念包括: 仓库(Repository):Git使用仓库来存储文件的版本历史。一个仓库可以包含多个文件