代码随想录算法训练营第一天 | 数组-二分查找-移除元素

数组理论基础

  • 数组是存放在连续内存空间上的相同类型数据的集合
    • 数组可以依赖索引高效访问 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]已被判断,不必作为新的闭边界
      }
      

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一定指向了最终数组末尾的下一个元素
    
posted @   daydayup_cpp  阅读(53)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示