代码随想录算法训练营第1天 | 数组二分法、数组双指针
1.代码随想录算法训练营第2天 | 数组滑动窗口、螺旋打印
2.代码随想录算法训练营第1天 | 数组二分法、数组双指针
3.代码随想录算法训练营第3天 | 链表删除元素、翻转链表4.代码随想录算法训练营第4天 | 链表两两交换、删除倒N、链表相交、环形链表5.代码随想录算法训练营第6天 | 哈希表的应用、复习快慢指针思想6.代码随想录算法训练营第7天 | 哈希表和双指针结合、三数和四数之和7.代码随想录算法训练营第8天 | 复习字符串API、双指针8.代码随想录算法训练营第9天 | 复习字符串匹配、KMP9.代码随想录算法训练营第10天 | 复习队列和栈10.代码随想录算法训练营第11天 | 复习逆波兰表达式求值11.代码随想录算法训练营第13天 | 复习二叉树基础12.代码随想录算法训练营第14天 | 复习二叉树翻转13.代码随想录算法训练营第15天 | 二叉树进阶14.代码随想录算法训练营第16天 | 二叉树更加进阶15.代码随想录算法训练营第17天 | 复习二叉搜索树16.代码随想录算法训练营第18天 | 二叉搜索树进阶17.代码随想录算法训练营第20天 | 二叉搜索树中级18.代码随想录算法训练营第21天 | 二叉搜索树结尾19.代码随想录算法训练营第22天 | 开始复习回溯20.代码随想录算法训练营第23天 | 回溯进阶21.代码随想录算法训练营第24天 | 复习组合问题22.代码随想录算法训练营第25天 | 回溯问题完结23.代码随想录算法训练营第27天 | 初入贪心24.代码随想录算法训练营第28天 | 贪心进阶二分法
2024年7月3日
重点是理解左闭右开和左闭右闭的选择对middle±1的影响。如果判断过了,下一次循环就不应该包含这个边界。
易错
- 注意计算mid的方式,直接求均值的错误方式会超出上界。
- 不是mid和target比较而是nums[mid]。
题704. 二分查找
//左闭右开
class Solution {
public int search(int[] nums, int target) {
int left=0,right=nums.length;
int mid=0;
while(left<right){
mid = left+(right-left)/2;
if(nums[mid]>target){
right = mid;
}else if(nums[mid]<target){
left = mid+1;
}else{
return mid;
}
}
return -1;
}
}
//左闭右闭
class Solution {
public int search(int[] nums, int target) {
int left = 0,right = nums.length-1;
int mid=0;
while(left<=right){
mid = left+(right-left)/2;
if(target<nums[mid]){
right = mid-1;
}else if(target>nums[mid]){
left = mid+1;
}else{
return mid;
}
}
return -1;
}
}
题35. 搜索插入位置
class Solution {
public int searchInsert(int[] nums, int target) {
int left=0,right=nums.length-1;
int mid=0;
if(target<nums[0]){
return 0;
}
if(target>nums[right]){
return right+1;
}
while(left<=right){
mid = left+(right-left)/2;
if(target<nums[mid]){
right = mid-1;
}else if(target>nums[mid]){
left=mid+1;
}else{
return mid;
}
}
return left;
}
}
题34. 在排序数组中查找元素的第一个和最后一个位置
class Solution {
public int[] searchRange(int[] nums, int target) {
int left=0,right=nums.length-1;
int mid=0;
int r1=-1,r2=-1;
while(left<=right){
mid = left+(right-left)/2;
if(nums[mid]>target){
right = mid-1;
}else if(nums[mid]<target){
left = mid+1;
}else{
r1=mid;
right=mid-1;//继续往左尝试
}
}
left=0;
right=nums.length-1;
while(left<=right){
mid = left+(right-left)/2;
if(nums[mid]>target){
right = mid-1;
}else if(nums[mid]<target){
left = mid+1;
}else{
r2=mid;
left=mid+1;//继续往右尝试
}
}
return new int[]{r1,r2};
}
}
题69. x 的平方根
class Solution {
public int mySqrt(int x) {
int left=0,right=x;
int mid=0,res=-1;
while(left<=right){
mid = left+(right-left)/2;
if((long)mid*mid<x){//注意必须转long防止int*int溢出
res=mid;
left=mid+1;
}
else if((long)mid*mid>x){
right=mid-1;
}else{
return mid;
}
}
return res;
}
}
题367. 有效的完全平方数
class Solution {
public boolean isPerfectSquare(int x) {
int left=0,right=x;
int mid=0,res=-1;
while(left<=right){
mid = left+(right-left)/2;
if((long)mid*mid<x){//注意必须转long防止int*int溢出
res=mid;
left=mid+1;
}
else if((long)mid*mid>x){
right=mid-1;
}else{
return true;
}
}
return false;
}
}
移除数组元素
使用快慢指针。快指针遍历,遇到符合需求的,用慢指针给数组赋值。
注意
- 遍历范围为快指针直到数组末尾;
- 不管是不是同一位置,统一将快指针数值复制到慢指针;
- 如果不符合要求,慢指针不动,快指针进1;
- 如果符合要求,先复制值,再统一进1。
题27. 移除元素
class Solution {
public int removeElement(int[] nums, int val) {
int left=0,right=0;
for(;right<nums.length;){
if(nums[right]!=val){
nums[left] = nums[right];
left+=1;//赋了有效值才右移
}
right+=1;//每一次都右移
}
return left;
}
}
题26. 删除排序数组中的重复项
class Solution {
public int removeDuplicates(int[] nums) {
HashSet<Integer> set1 = new HashSet<>();
int r1 = 0,r2=0;
for(;r2<nums.length;){
if(!set1.contains(nums[r2])){
set1.add(nums[r2]);
nums[r1] = nums[r2];
r1+=1;
}
r2+=1;
}
return set1.size();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端