代码随想录算法训练营第一天 | 数组-二分查找-移除元素
数组理论基础
- 数组是存放在连续内存空间上的相同类型数据的集合
- 数组可以依赖索引高效访问 O(1)
- 数组在增删等动态操作中效率较低,牵一发而动全身 O(n)
- 举一个字符数组(大小为1)的例子
- Q:二维数组[行][列]的内存空间地址是连续的吗? A:不同编程语言的内存管理不同,但在C++中是连续的
- 在没有给出全部初值时,两个下标必须全部显式说明
int a[2][3]={1,2};
,剩下的数组元素会被以0赋值 - 在给出全部初值时,第一维下标可以不用显式说明
int a[][3] = { 1,2,3,4,5,6 };
- 在没有给出全部初值时,两个下标必须全部显式说明
704 二分查找(针对有序数组)
- 区间的边界问题
- 左闭右闭区间[0,size-1],且l可以=r
int r = nums.size() - 1, l = 0; while (l <= r) { int mid = (r - l) / 2 + l; if (target == nums[mid]) return mid; else if (target < nums[mid]) r = mid - 1; //nums[mid]已被判断,不必作为新的闭边界 else l = mid + 1; //nums[mid]已被判断,不必作为新的闭边界 }
- 左闭右开区间[0,size),且l不可以=r
int r = nums.size(), l = 0; while (l < r) { int mid = (r - l) / 2 + l; if (target == nums[mid]) return mid; else if (target < nums[mid]) r = mid; //nums[mid]已被判断,可作为新的开边界 else l = mid + 1; //nums[mid]已被判断,不必作为新的闭边界 }
- 左闭右闭区间[0,size-1],且l可以=r
27 移除元素
-
暴力解法 O(n²)
int size = nums.size(); for (int i = 0; i < size;) { if (nums[i] == val) { for (int j = i; j < size - 1; j++) nums[j] = nums[j + 1]; size--; } else i++; } return size;
-
同向双指针法 O(n)
- 快指针fast:获取到新数组所需元素
- 慢指针slow:给新数组赋值
int size = nums.size(); int slow = 0; for (int fast = 0; fast < size; fast++) { if (nums[fast] != val) nums[slow++] = nums[fast]; } return slow;
-
相向双指针法 O(n)
int l = 0; int r = nums.size() - 1; while (l <= r) { // 找左边等于val的元素 while (l <= r && nums[l] != val) { l++; } // 找右边不等于val的元素 while (l <= r && nums[r] == val) { r--; } // 将右边不等于val的元素覆盖左边等于val的元素 if (l < r) { nums[l++] = nums[r--]; } } return l; // leftIndex一定指向了最终数组末尾的下一个元素
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端