算法基础1:数组,二分法

本文讨论了数组在内存中的存储特性,以及如何使用二分法进行高效搜索。还介绍了两种移除数组元素的方法:暴力解法和快慢双指针优化版,强调了搜索区间确认和算法效率的重要性。
摘要由CSDN通过智能技术生成

数组

数组最大的特点: 在内存中存储时空间连续。
所以,数组确定好大小后,内存大小不能修改,不能删除元素,只能覆盖。

二分法

题目链接:704二分查找

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left =0;
        int right = nums.size()-1;

        while(left<=right){
            int middle = (left+right)/2;
            if(nums[middle] > target){
                right = middle -1;
            }
            else if(nums[middle] < target){
                left = middle+1;
            }
            else{
                return middle;
            }
        }
        return -1;

    }
};

思路

  1. 最重要的是确认搜索区间,左闭右闭or左闭右开,根据搜索区间做后续所有条件的推论。
  2. while的终止条件,判断是否合法。左闭右闭是 小于等于,因为当左边界和右边界相等时,该区间合法。
  3. left, right赋值的判断,如果已经判断过了,就应该从接下来的区间中排除。

移除元素27

1暴力解法

int removeElement(vector<int>& nums, int val) {
    int size=nums.size();
    for (int i=0;i<size;i++){
        if(nums[i]==val){
            for(int j=i+1;j<size;j++) nums[j-1]=nums[j];
            size--;
            i--;    
        }        
    }
    return size;
}

思路

通过两层for循环来实现,每发现一个要移除的元素,就把后面的所有值全部挪前一位。需要注意的是,如果删除了,重新排了序列,就需要对当前位置再次进行判断,不然如果重复出现val,就无法删掉第二次的val,i–存在的意义。

2快慢双指针解法

int removeElement(vector<int>& nums, int val) {
    int slow =0;
    for(int fast=0; fast<nums.size(); fast++){
        if(nums[fast]!=val){
            nums[slow++] = nums[fast];
        }
    }
    return slow;
}

思路

  1. 想象自己要从原数组中删除掉指定的元素,构建一个新的数组。
  2. fast指针指向的是新数组的数值,slow指针指的是新数组的index。
  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值