代码随想录第一天|数组part01
- 二分查找
题目建议: 大家今天能把 704.二分查找 彻底掌握就可以,至于 35.搜索插入位置 和 34. 在排序数组中查找元素的第一个和最后一个位置 ,如果有时间就去看一下,没时间可以先不看,二刷的时候在看。
先把 704写熟练,要熟悉 根据 左闭右开,左闭右闭 两种区间规则 写出来的二分法。
题目链接:https://leetcode.cn/problems/binary-search/
文章讲解:https://programmercarl.com/0704.二分查找.html
视频讲解:https://www.bilibili.com/video/BV1fA4y1o715
题目感想:
1.首先要知道左闭右闭还是左闭右开,然后就是搞清楚边界更新是怎么的,就是不会是最终结果的放在范围外(取不到值),比如:
1)左闭右闭,判断之后middle是肯定取不到的,那么更新后的边界不能是middle,大于middle则,left=middle+1;小于middle则,right=middle-1;
2)左闭右开,判断之后middle是肯定取不到的,那么更新后的范围也要保证middle取不到,大于middle则,left=middle+1;小于middle则,right=middle(右边是开区间,所以此时的middle是取不到的
3)左闭右闭 a〈=b
4)左闭右开a 〈b
2.注意对输入的值进行校验
// 避免当 target 小于nums[0] nums[nums.length - 1]时多次循环运算
if (target < nums[0] || target > nums[nums.length - 1]) {
return -1;
}
- 移除元素
题目建议: 暴力的解法,可以锻炼一下我们的代码实现能力,建议先把暴力写法写一遍。 双指针法 是本题的精髓,今日需要掌握,至于拓展题目可以先不看。
题目链接:https://leetcode.cn/problems/remove-element/
文章讲解:https://programmercarl.com/0027.移除元素.html
视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP
题目感想:
1.暴力法
思路就是直接遍历数组,遍历到要去除的数字时,就进入一个循环,将后面的数字全部向前移动一位,在退出这个循环之前要将遍历用的索引-1,因为此时的索引指向的已经是个新元素了,不-1将会漏掉这个元素的判断,同时数组长度-1;
2.双指针法
快慢指针法:
首先不要被快慢这个词误导,其实可以这么理解,一个是一直会移动的指针,一个是可能会在某个索引停下来的指针,整个过程可以理解为原地创建一个新的数组,会移动的指针会去寻找可以加入新数组的元素(非目标排除数字以外的数字),会停的指针会指向新数组的索引,当被之乡的地方加入了元素之后,会停的数组会移到下一个索引位;
双向指针法:
主要的思想是右边的非目标排除数去覆盖左边的目标排除数,覆盖后左边+1,右边继续向左移动至非目标排除数,左移代码:
while(right >= 0 && nums[right] == val) right--;
977.有序数组的平方
题目建议: 本题关键在于理解双指针思想
题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/
文章讲解:https://programmercarl.com/0977.有序数组的平方.html
视频讲解: https://www.bilibili.com/video/BV1QB4y1D7ep
题目感想:
首先数组本来就是有序的,经过平方后,最大的数字总是在数组的最两边上,我们只要比较最边上的数字的平方后的大小,然后选择最大的加入新数组即可
int l = 0;
int r = nums.length - 1;
int[] res = new int[nums.length];
int j = nums.length - 1;
while(l <= r){
if(nums[l] * nums[l] > nums[r] * nums[r]){
res[j--] = nums[l] * nums[l++];
}else{
res[j--] = nums[r] * nums[r--];
}
}
总结:
1.看题目时要有敏锐性,看看能不能双指针,实在不行再试试暴力,暴力之后看看还能怎么优化;
2.学习时忘记记录时间了,下次开始学习时一定记录时间;
3.md文档还是不够熟练,有很多格式没调好,还在学习中;
代码随想录第一天|数组part01的更多相关文章
- 代码随想录第十三天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素
第一题150. 逆波兰表达式求值 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 注意 两个整数之间的除法只保留整数部分. ...
- 代码随想录第八天 |344.反转字符串 、541. 反转字符串II、剑指Offer 05.替换空格 、151.翻转字符串里的单词 、剑指Offer58-II.左旋转字符串
第一题344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的额外空间解决这 ...
- 《疯狂Java:突破程序员基本功的16课》读书笔记-第一章 数组与内存控制
很早以前就听过李刚老师的疯狂java系列很不错,所以最近找一本拿来拜读,再此做下读书笔记,促进更好的消化. 使用Java数组之前必须先对数组对象进行初始化.当数组的所有元素都被分配了合适的内存空间,并 ...
- 代码随想录-day1
链表 今天主要是把链表专题刷完了,链表专题的题目不是很难,基本都是考察对链表的操作的理解. 在处理链表问题的时候,我们通常会引入一个哨兵节点(dummy),dummy节点指向原链表的头结点.这样,当我 ...
- 代码随想录 day0 博客怎么写
前言 2.25日开始记录自己的博客生涯以及代码随想录训练营的每日内容 一.题目链接怎么找?怎么设置连接? 力扣题目链接1:力扣 二.正文怎么写? 二分查找 算法思路: 二分查找需要保证数组为有序数组同 ...
- 【LeetCode动态规划#05】背包问题的理论分析(基于代码随想录的个人理解,多图)
背包问题 问题描述 背包问题是一系列问题的统称,具体包括:01背包.完全背包.多重背包.分组背包等(仅需掌握前两种,后面的为竞赛级题目) 下面来研究01背包 实际上即使是最经典的01背包,也不会直接出 ...
- 分享非常有用的Java程序 (关键代码)(四)---动态改变数组的大小
原文:分享非常有用的Java程序 (关键代码)(四)---动态改变数组的大小 /** * Reallocates an array with a new size, and copies the co ...
- 《代码的第一行——Android》封面诞生
<代码的第一行--Android>已经上市近一个月,现在的情况是相当不错的销售,也特别感谢众多朋友的支持. 其实一本好书,假设你想卖.除了给予外力所要求的内容.封面设计是至关重要的,这本书 ...
- Js $.merge() 函数(合并两个数组内容到第一个数组)
定义和用法 $.merge() 函数用于合并两个数组内容到第一个数组. 语法 $.merge( first, second ) 参数 描述 first Array类型 第一个用于合并的数组,合并后 ...
- 代码随想录训练营day 3|59.螺旋矩阵II 加 数组总结篇
59.螺旋矩阵II 题目链接:59.螺旋矩阵II 题目描述:给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵. 示例: 输入: 3 输出: [ [ 1 ...
随机推荐
- 结构化语句header nav aside main article section footer
点击查看代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- Selenium KPI接口 时间等待
常见的时间等待有三种: 固定.显示.隐士. 应用场景: 主要用于模拟真实的用户操作,有时时间过于短,页面响应不过来,从而造成元素定位不到. 使用格式: sleep(3):一般用于调试 implicit ...
- ubuntu install 下载安装包报错 subprocess installed post-installation script returned error exit status 10
前言 在 ubuntu 环境下使用 sudo apt-get install 安装软件包时,会报错 XXX 为安装软件包 dpkg:error processing package XXX (--co ...
- vue强制刷新页面
方法一 this.$router.go(0) // 会出现一段空白页,用户体验不好 方法二 在 app.vue 中定义 reload() 方法 <template> <div id= ...
- Go new函数 例子解析答疑
package main import "fmt" func main() { p1 :=new(int) *p1 =1 fmt.Println("p1",p1 ...
- Django实战项目-学习任务系统-配置定时调度任务
接着上期代码内容,继续完善优化系统功能. 本次增加配置定时调度任务功能,学习任务系统定时任务管理添加的定时学习任务,需要通过配置调度任务,定时发布周期性的学习任务. 以及每天定时发送学生用户属性值,积 ...
- 浅谈 C# 13 中的 params 集合
前言 在 C# 13 中,params 的改进使其从可变数量的数组参数升级为可变数量的集合类型参数.这一改进通过支持高性能集合类型(如Span<T>,ReadOnlySpan<T&g ...
- ORA-01779: cannot modify a column which maps to a non-key-preserved table
Oracle中试图对一个子查询进行更新时可能会出现ORA-01779错误.该错误的内容为: ORA-01779: cannot modify a column which maps to a non- ...
- DEV插件--Spreadsheet1电子表格
常用操作Spreadsheet常用属性标题栏是否可见 Spreadsheet1.TitleBar.Visible=true标题栏背景颜色 Spreadsheet1.TitleBar.Interior. ...
- Bitcoin部署到openEuler RISC-V
Bitcoin项目源码是用C++写的,我对C++以及它的编译工具又比较熟悉,这次我尝试了在openEuler RISC-V 24.09上面部署Bitcoin.网上编译Bitcoin源码的很多都是以 ...