代码随想录算法训练营第一天

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

704.二分查找

暴力法,耗时3:05

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;
    }
};

二分法,耗时10:39

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

主要是边界处理。要么定义为左闭友闭,要么是左闭右开。两种思路写法不同

27.移除元素

暴力法,耗时9:45

一开始没有让int size = nums.size();,然后超时了。

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--;
                size--;
            }
        }
        return size;
    }
};

双指针法:

看了解析之后写的,耗时2:02,目前是懂了双指针的思想了

快指针用来搜寻元素,慢指针用来更新数组下标位置。

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

977.有序数组的平方

暴力法一下子就做出来了。

双指针法,看了解析

一个指针从前往后,一个指针从后往前

class Solution {
public:
    vector<int> sortedSquares(vector<int>& A) {
        int k = A.size() - 1;
        vector<int> result(A.size(), 0);
        for (int i = 0, j = A.size() - 1; i <= j;) { // 注意这里要i <= j,因为最后要处理两个元素
            if (A[i] * A[i] < A[j] * A[j])  {
                result[k--] = A[j] * A[j];
                j--;
            }
            else {
                result[k--] = A[i] * A[i];
                i++;
            }
        }
        return result;
    }
};

今天到这。

代码随想录算法训练 文章被收录于专栏

代码随想录算法训练

全部评论

相关推荐

头像
04-15 01:03
南京大学 Java
(Java&nbsp;后端开发)一、&nbsp;个人背景与经历挖掘自我介绍AI&nbsp;工具在学习实践中的融入追问:AI&nbsp;工具的具体使用方式与协同二、&nbsp;计算机基础与&nbsp;Java&nbsp;核心栈和队列的区别及适用场景:追问&nbsp;1:基于数组实现栈和队列的注意点:追问&nbsp;2:循环队列的扩容逻辑与注意事项接口(Interface)与抽象类(Abstract&nbsp;Class)的区别追问&nbsp;1:支付系统设计(支付宝、微信等),选接口还是抽象类?追问&nbsp;2:通用的日志和权限校验逻辑应该放在哪?三、&nbsp;数据库与架构设计分库分表策略及高并发应用追问&nbsp;1:某个分片出现热点问题如何解决?追问&nbsp;2:加盐打散和缓存如何避免对业务逻辑/查询性能产生负面影响?项目管理系统表结构设计(包含项目、任务、成员)追问&nbsp;1:多成员负责多任务的数据库表设计追问&nbsp;2:任务优先级和状态频繁变化,如何保证灵活性?四、&nbsp;网络通信与接口设计大模型文本生成&nbsp;HTTP&nbsp;接口设计(替换了原本的成本控制题(不会成本控制)追问&nbsp;1:流式返回(Stream)的具体数据传输设计追问&nbsp;2:错误码如何设计以便前端快速定位?五、&nbsp;场景解决与行为面试识别并解决潜在隐患的经历追问&nbsp;1:布隆过滤器的误判与分布式锁的性能瓶颈应对追问&nbsp;2:极端流量下的边界条件与降级策略
查看21道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务