LeetCode 704 二分查找 27 移除元素 | 代码随想录25期训练营day1

数组

LeetCode 704 二分查找 2023.10.25

  • LeetCode 704 二分查找[题目链接]
  • 代码随想录讲解[链接]
    LeetCode 704 二分查找 27 移除元素 | 代码随想录25期训练营day1_第1张图片
  • 提供无重复递增或递减排序,用于搜索某一条件值
  • 方法:二分查找将有序数组查找范围每次压缩一半,变动两端index
  • 关键:把所有元素都考虑在内!不要漏!(左闭右闭、左闭右开)
  • 扩展:也可用于除法求平方根
  int search(vector<int>& nums, int target) {
     int end = nums.size();
     for (int i = 0; i < end; ) //左闭右开
     {
         int mid = i + (end - i)/2;
         if(nums[i] == target)
         {
             return i;
         }
         if(nums[mid] == target)
             return mid;
         else if(nums[mid] < target)
         {
             i = ++mid;
         }
         else //nums[mid] > target
         {
             end = mid;
             i++;
         }
     }
     return -1;
 }
  • 时间复杂度O(log n);空间复杂度O(1)

LeetCode 27 移除元素 2023.10.25

  • LeetCode 27 移除元素[题目链接]
  • 代码随想录讲解[链接]
    LeetCode 704 二分查找 27 移除元素 | 代码随想录25期训练营day1_第2张图片
  • 方法一:暴力搜索,然后将元素前移
  • 方法二:快慢指针,用快指针找到所查元素后,慢指针不动,continue;因此所查元素会被覆盖
  • 两个指针可以在一侧依次增加;也可以在异侧一个加,一个减
  int removeElement(vector<int>& nums, int val) {
	  int size = nums.size();
	   int sym = 0;
	   sort(nums.begin(), nums.end());//本题中要求可以变换顺序
	//以下做法是第一次自己所做时所想,时间复杂度为O(2n)=O(n)
	   for (int i = 0; i < size; i++)
	   {
	       if (nums[i] == val)
	       {
	           sym ++;
	       }
	       else if (nums[i] != val && sym != 0)
	       {
	           for (int j = 0; j < size-i; j++)
	           {
	               //if(i+j < size)
	               nums[i - sym + j] = nums[i+j];
	           }
	           return size - sym;
	       }
	   }
	   return size - sym;
	}
  • 时间复杂度O(n) 空间复杂度O(1)

你可能感兴趣的:(LeetCode刷题,代码随想录训练营,leetcode,算法)