力扣磨题记录

基础小白,第一次开始准备记录。之所以叫磨题,是因为我做题的速度不能用刷来形容。。。但我愿意死磕,就像昨晚我梦见我自己变成骑兵连的一员,其实在梦里我真的害怕了,可以逃跑也可以投降,但我选择跟敌人死磕!

通常我是记在笔记上的,但有点慢,而且考虑重新敲一遍代码更有好处,That's all

2023.3.10 

 此前已经做过力扣上剑指offer的一些题,磕磕绊绊大概也就20几道。感觉不系统,昨天在知识星球上购买了代码随想录的会员,今天决定按照上面的刷题指南走一波,然后再做剑指offer和热题100,如果能做完,再之后就再制定其他计划。毕竟计划总是需要调整,现在我只想扎扎实实投入进去。

至于计算机基础,打算依照上面的经验之谈,进行快速学习,然后针对问题展开复习。

项目的话,正在着手实现一个高并发HTTP服务器,因为没有基础,只能从零开始,先从编写请求响应成功开始。

会在这里写一些自己遇到的问题,还好没人看,幼稚愚蠢也是自己的。相信自己总有拜托它的一天。

##### 磨题日记——数组

(一) 二分查找https://leetcode.cn/problems/binary-search/——力扣704,简单

 错误原因:else针对的是它上面的if,而不包括第一个if的判断情况。所以它不执行第二次循环,代码一看,“哦?中间值大于目标值或者小于目标值我判断完了,那我就直接返回当前的mid。做完了!很快啊!”  实际上中间值等不等于压根没判断。

低级错误不要再犯

//错误示例
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-left)/2;
             if(nums[mid]>target) right=mid-1;
             if(nums[mid]<target) left=mid+1;
             else return mid;    //错误地点
         }
         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-left)/2;
             if(nums[mid]>target) right=mid-1;
             if(nums[mid]<target) left=mid+1;   //或者写成if elseif else的形式
             if(nums[mid]==target) return mid;
         }
         return -1;
    }
};
  • 时间复杂度:O(log n)
  • 空间复杂度:O(1)

 问题释疑:问什么不是 int mid = (left + right) / 2?

答:这么写可能会发生溢出,left + right很有可能会超出int的范围 。int取值范围:int占的是4个字节,一个字节8位,也就是32位,取值范围是-2^31 ---- 2^31-1。

布置相关作业复习:

C++基本类型,溢出问题

力扣35 搜索插入位置 简单 https://leetcode.cn/problems/search-insert-position/

力扣34 在排序数组中查找元素的第一个和最后一个位置 中等 (之前做过)https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/

(二) 移除元素27. 移除元素 - 力扣(LeetCode)

//正确代码一
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
          for(auto it=nums.begin();it!=nums.end();it++)
          {
              if(val==*it)
                {
                    nums.erase(it);
                    it--;
                }
          }
          return nums.size();
    }
};

//正确代码二
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int n = nums.size();
        int left = 0;
        for (int right = 0; right < n; right++) {
            if (nums[right] != val) {
                nums[left] = nums[right];
                left++;
            }
        }
        return left;
    }
};

 暴力循环肯定排除。第一种办法是我自己写的,用迭代器操作,速度击败100%,内存击败95%。

但第二种是需要仔细琢磨的一种办法——双指针。这是常用算法,需要去理解。

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

 复习内容:

迭代器内部实现原理和时空复杂度。

图内容源于代码随想录

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值