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

130 阅读2分钟
704. 二分查找

题目链接:leetcode.cn/problems/bi…

前置条件:数值有序

效果:可以将 时间复杂度 优化 为 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. 移除元素

题目链接:leetcode.cn/problems/re…

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

注意 各指针 在 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 ;
​
    }
};