代码随想录算法训练营第一天 | 数组-二分查找-移除元素
数组理论基础
- 数组是存放在连续内存空间上的相同类型数据的集合
- 数组可以依赖索引高效访问 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一定指向了最终数组末尾的下一个元素

浙公网安备 33010602011771号