每日算法笔记 DAY 1

DAY 1

 

二分法 注意边界问题 查看是否左闭右闭 或者左闭右开 根据开始的left,right设置的开闭原则 ,再根据开闭在for循环里面思考怎么设置边界

双指针

​ 记住数组在内存空间中是连续的 单纯的删除并不能移除元素 而是o(n)的时间复杂度

​ leetcode 27.移除元素中 使用快慢指针 快指针寻找需要删除的元素 慢指针记录索引


DAY 2

 

1. Leetcode 977 . 有序数组的平方

双指针法

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

vector<int> sortedSquares(vector<int>& nums)
  1. return为vector

  2. 暴力方法很容易想到但是时间复杂度为O(n+logn)

  3. 思考题目 数组是有序的 如果是无序的 这就是中等题

​ 考虑最大值在两端 不在中间 因此可以考虑是否可以使用双指针

​ 本题的难度并不是双指针的用法 而是判断什么时候可以用双指针

  1. 总结

​ 在排序时,数组是有序的,极值在两端时,可以考虑双指针。


  1. *Leetcode 209 .长度最小的子数组* *中等*

​ 给定一个含有 n 个正整数的数组和一个正整数 target 。

​ 找出该数组中满足其总和大于等于 target 的长度最小的 子数组

子数组

[numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0

1.看到数组 一般会考虑到几种常见的解法 双指针(滑动窗口也是双指针的一种) 哈希 排序 分治 动态规划

一般看上去比较难的题目会优先考虑到动态规划

此题可以使用dp或双指针解 本次使用双指针

  1. 这题的难点在于怎么更新子串的长度,每次满足子串的大小>=target时,更新子串的长度,并且取最短的子串长度。

​ 子串长度不难想,快指针往后推,慢指针指向开始的索引,满足条件时,记录下子串的长度。

subLength = (j - i +1);

​ 之后思考怎么更新子串的最短长度。于此同时 慢指针向后推进查看是否满足条件,满足条件时,更新子串长度。

   ```c++ 

result = result < subLength ? result:subLength;
```

  1. 在更新子串长度时,需要和比记录的长度大的比较才行,如果开始result=0时,则结果一直为0,所以result取最大值
 int result = INT32_MAX;
  1. 总结

画图思考滑动窗口,或者说指针是怎么移动的。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值