代码随想录第一天|704.二分查找、27.移除元素、977.有序数组的平方

704.二分查找

力扣题目链接文章讲解/视频讲解

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


示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9输出: 4

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2输出: -1

思路:两种写法:左闭右闭和左闭右开。先说第一种,我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right] 

区间的定义这就决定了二分法的代码应该如何写,因为定义target在[left, right]区间,所以有如下两点:

  • while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
  • if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1

代码如下:

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 - left) / 2;
            if(nums[middle] > target){
                right = middle - 1;
            }
            else if(nums[middle] < target){
                left = middle + 1;
            }
            else{
                return middle;
            }
        }
        return -1;
    }
};

左闭右开可以自己想一想怎么写。

27.移除元素

力扣题目链接文章讲解/视频讲解

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
  • 返回 k。

示例 1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2,_,_]

思路:第一种暴力解法,大致就是利用两个嵌套的for循环,外层for循环遍历数组,内层for循环查找等于val的元素,如果查找到就将val后面的数字依次往前移一位。代码如下:

class Solution {
public:
    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;
    }
};

第二种双指针法,定义快指针fast和慢指针slow。

27.移除元素-双指针法

代码如下:

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
            if (val != nums[fastIndex]) {
                nums[slowIndex++] = nums[fastIndex];
            }
        }
        return slowIndex;
    }
};

977.有序数组的平方

力扣题目链接文章讲解/视频讲解

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

    示例 1:

    输入:nums = [-4,-1,0,3,10]
    输出:[0,1,9,16,100]
    解释:平方后,数组变为 [16,1,0,9,100]
    排序后,数组变为 [0,1,9,16,100]

    示例 2:

    输入:nums = [-7,-3,2,3,11]
    输出:[4,9,9,49,121]

    思路:暴力解法就是将数组所有值平方后进行排序,代码就不展示了,自己写。

    主要是使用更简单的双指针法。定义i指针指向数组头元素,j指针和k指针指向数组尾元素。如果i指针指向元素平方比j指向元素平方大,那么a[k] = a[i],i++,k--;如果j指针指向元素平方比i指向元素平方大,那么a[k] = a[j],j--,k--。一直循环这个过程直到i == j,最后再让新数组的头元素等于此时i指针指向元素平方即可(j也行)。代码如下:

    class Solution {
    public:
        vector<int> sortedSquares(vector<int>& nums) {
            int i = 0;
            int j = nums.size()-1;
            int k = nums.size()-1;
            vector<int> result(nums.size(), 0);
            while(i != j){
                if(nums[i] * nums[i] < nums[j] * nums[j]){
                    result[k] = nums[j] * nums[j];
                    k--;
                    j--;
                }
                else{
                    result[k] = nums[i] * nums[i];
                    k--;
                    i++;
                }
            }
            result[0] = nums[i] * nums[i];
            return result;
        }
    };

    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
    红包 添加红包
    表情包 插入表情
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值