算法DAY1 | 数组part1

74 阅读2分钟

LeetCode 704-二分查找

题目描述:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

力扣题目链接(opens new window)

思路:
  • 该题是一个有序且无重复元素的整型数组,满足二分法的使用条件
  • 二分法注意点:写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。
  • 我选择左闭右开,while寻找中每一次边界的处理都要坚持根据区间的定义来操作,左闭右开的话,left=right就没有意义
二分法-左闭右开
int search(int* nums, int numsSize, int target){
    int left = 0, right = numsSize, mid = 0;
    while(left < right)//左闭右开区间,left==right无意义
    {
        mid = left + ((right-left) >> 1);
        if(target < nums[mid])
        {
            right = mid;//target在左区间,在[left,mid)中
        }
        else if(target > nums[mid])
        {
            left = mid + 1;//target在右区间,在[mid+1,right)中
        }
        else
        {
            return mid;//找到目标值
        }
    }
    return -1;
}
总结
  • 学习到二分法while循环中每一次边界的处理都要坚持根据区间的定义来操作
  • mid值的计算:mid = left + ((right-left) >> 1),是为了防止left和right较大时会有溢出

LeetCode 27-移除元素

题目描述:给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度 leetcode.cn/problems/re…

思路:

双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。

定义快慢指针

  • 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
  • 慢指针:指向更新 新数组下标的位置
int removeElement(int* nums, int numsSize, int val){
    int slow = 0;
    for(int fast = 0;fast  < numsSize;fast++)
    {
        if(val != nums[fast])
        {
            nums[slow++] = nums[fast];
        }
    }
    return slow;
}
总结:
  • 任何变量/指针都是有含义的,理清楚变量的含义,才能游刃有余