代码随想录算法训练营第一天 | 704二分查找、27移除元素

1.704二分查找

二分查找题目icon-default.png?t=N7T8https://leetcode.cn/problems/binary-search/二分法视频链接icon-default.png?t=N7T8https://www.bilibili.com/video/BV1fA4y1o715/

思路:第一想到使用暴力求解,遍历数组寻找相同元素输出下标;

class Solution {
public:
    int search(vector<int>& nums, int target) {
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]==target)
            {
                return i;
                
            }
        }
        return -1;
    }
};

 二分法学习(前提是数组是有序数组,这也是使用二分查找的基础条件):

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left=0;
        int right= nums.size()-1;
        
        while(left<=right)
        {
            int mid=(left+right)/2;
            if(nums[mid]==target)
            {
                return mid;
            }
            else if(nums[mid]<target)
            {
                left=mid;
            }
            else if(nums[mid]>target)
            {
                right=mid;
            }
        }

    return -1;

    }
};

超出了时间限制,left=mid+1;right=mid-1才可以保证时间,不过用时更长了QAQ;

以上为左闭右闭,左闭右开的情况需要while(left<right);同时向左移动right时,也应该放弃mid-1,而是right=mid,防止right=left情况

2. 27移除元素

题目链接:27移除元素备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/remove-element/

文章讲解:代码随想录代码随想录PDF,代码随想录百度网盘,代码随想录知识星球,代码随想录八股文PDF,代码随想录刷题路线,代码随想录知识星球八股文icon-default.png?t=N7T8https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html

视频讲解:27. 移除元素《代码随想录》算法公开课开讲啦!快来打卡!代码随想录刷题网站:programmercarl.com, 视频播放量 103379、弹幕量 833、点赞数 3438、投硬币枚数 2911、收藏人数 1094、转发人数 181, 视频作者 代码随想录, 作者简介 我是Carl,哈工大师兄,先后在腾讯和百度从事一线技术研发的程序员,公众号「代码随想录」,相关视频:12年刷题导师左神!耗时数月打造【LeetCode算法300题】数据结构与算法:基础→进阶→大厂面试全套教程,BATJ一线大厂笔试+面试必问详解!,二分查找为什么总是写错?,如果回到大一,我绝不会再刷算法题|回忆我的大学学习生活,【LeetCode 每日一题】27. 移除元素 | 手写图解版思路 + 代码讲解,一个视频带你彻底搞懂双指针算法——链表4:力扣2130.链表最大孪生和(中等题),leetcode-双指针篇 27题 移除元素,6-1-4数组元素的删除,【LeetCode 每日一题】88. 合并两个有序数组 | 手写图解版思路 + 代码讲解,当你过度准备了一场代码面试时……,1008 数组元素循环右移问题 (20 分)icon-default.png?t=N7T8https://www.bilibili.com/video/BV12A4y1Z7LP

 思路:第一想到使用暴力求解,遍历数组寻找相同元素,然后删除掉,再输出长度,但是找不到合适的函数,所以使用再加一个for循环;

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];
                }
                i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
                size--;
            }
        }
    return size;
    }
};

但是不满足复杂度要求,学习双指针法:

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;
    }
};
int leftIndex = 0;
        int rightIndex = nums.size() - 1;
        while (leftIndex <= rightIndex) {

            while (leftIndex <= rightIndex && nums[leftIndex] != val){
                ++leftIndex;
            }
        
            while (leftIndex <= rightIndex && nums[rightIndex] == val) {
                -- rightIndex;
            }
            if (leftIndex < rightIndex) {
                nums[leftIndex++] = nums[rightIndex--];
            }
        }
        return leftIndex;   
    }

.双指针法会将后面的元素赋值到前面,但是移动最少元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值