704. 二分查找 27. 移除元素

704. 二分查找

题目链接:https://leetcode.cn/problems/binary-search/

 

前置条件:数值有序

 

效果:可以将 时间复杂度 优化 为 log(n)

 

思路:

target (可能 存在 的 )元素 等于 mid 位 元素 时 , 返回 当前 下标

target 元素 相对于 mid 位 元素 小 时 ,选择 左侧 区域 继续 查找

target 元素 相对于 mid 位 元素 大 时 ,选择 右侧 区域 继续 查找

 

细节 :

可以 从 3 , 2 , 1 个 /(奇数个 / 偶数个 ) 元素 的 节点 考虑 最终情况

 

代码:

 

class Solution {
public:
   int search(vector<int>& nums, int target) {

       int length ;
       int left;
       int right;
       int mid;

       length = end(nums) - begin(nums);

       left = 0;
       right = length - 1;
       mid = ( left + right ) / 2;


       while(left<=right)
      {
           if(nums[mid] == target)
          {
               return mid;

          }
           else if(target < nums[mid])
          {
               right = ( mid - 1 );
               mid = (left + right ) / 2;

          }
           else if(target > nums[mid])
          {
               left = ( mid + 1 );
               mid = (left + right ) / 2;

          }

      }

       return -1;


  }
};

 

 

 

27. 移除元素

题目链接:https://leetcode.cn/problems/remove-element/

 

对 “最新 处理 位置 ” 和 “有效 储存 最 末尾 的 位置 ” 分别 分配 一个 指针 进行 处理 / 记录

 

注意 各指针 在 xx 时刻 / 时段 所 指 的 位置

 

实际 使用 中 不建议 将 指针 初始化 为 -1 , “这样 的 处理 更 容易 产生 溢出 (是 可以 污染 其它 数据 / 搞崩 程序 服务 的 (如果 没 在 测试阶段 检测 出来 的 话 ) )”

 

注意 合理 地 使用 判断 条件 减少 访存 次数

 

注意 不要 把 剩余 的 有效 元素 数量 和 已经 删除 的 元素 的 数量 搞混

 

代码:

class Solution {
public:
   int removeElement(vector<int>& nums, int val) {



       //为 前进 方向 的 前部读取侧 分配 一个 指针 (记录 地址 ) , 为 后边 的 有效 内容 的 接受 序列 分配 一个 指针

       int length ;
       int ptr2;
       int ptr1;

       int k = 0 ;      //记录 符合 val 值 元素 的 个数  

       //注意 不要 搞 反 了 k   的 意义 , k 在 这里 表示 的 是   保留 下 的   有效 元素 数 , 而不是 “ ‘符合 条件’ 被 去除 的 数(元素) 的 数量”

       length = end(nums) - begin(nums) ;

       ptr2 = 0 ;
       ptr1 = -1 ;


       for(; ptr2 < length ; )
      {
           //cout<<"ptr2 : "<<ptr2<<"     nums[ptr2] : "<<nums[ptr2]<<endl;

           if(nums[ptr2] == val )
          {
               ptr2++;          

          }
           else if(nums[ptr2] != val)
          {
               if(ptr2 == ptr1 + 1 )
              {
                   ptr1++;
                   ptr2++;

                   k++;

              }
               else
              {
                   ptr1++;

                   nums[ptr1] = nums[ptr2];

                   ptr2++;

                   k++;

              }

               
          }


      }

       return k ;

  }
};
 
posted @ 2024-06-21 21:21  晴夜空  阅读(32)  评论(0)    收藏  举报