学习内容: LC27 移除元素

个人思路:

猛的一看感觉很简单,感觉一个for就可以解决。仔细查看之后发现暗藏玄机。

  1. 首先可以直接判断当 nums[i] == val时,删除list当前索引的元素。 del nums[index]
  2. 当 nums[i] == val时,将其和最后一个数进行交换。
    以上只是我当时能想到方法,但是这两种方法都要注意的是,如果用for进行遍历的话,删除或交换位置之后,i的值是会+1的,**这样会导致你下一次的判断是跳过了交换值的或跳过了删除值后一个值的。**所以针对这种情况,尽量使用条件语句对遍历变量i进行限制同时结合while语句进行遍历。
class Solution(object):def removeElement(self, nums, val):""":type nums: List[int]:type val: int:rtype: int"""res = 0i = 0while i != len(nums):     # while结合if组合使用if nums[i] == val:tmp = nums[-1]nums[-1] = valnums[i] = tmpnums.pop()else:res += 1i += 1return res

双指针方法

算法思路:思想如同上述思路2,就是将前面遍历出来的num[i]==val的值交换到数组末尾。设置两个指针fast和slow。其中fast用来从后先前寻找num[fast] != val的坐标,用slow从前往后来寻找nums[slow]==val的坐标,然后交换。

class Solution(object):def removeElement(self, nums, val):""":type nums: List[int]:type val: int:rtype: int"""if not nums or val not in nums:return len(nums)slow, fast = 0, len(nums)-1while slow < fast:while slow < fast and nums[slow] != val:slow += 1while slow < fast and nums[fast] == val:fast -= 1nums[slow], nums[fast] = nums[fast], nums[slow]if nums[slow] == val:return slowelse:return slow + 1

PS:代码看起来和快速排序的思路一样。
其中if nums[slow] == val: return slow 是值得深思的。首先需要先分析,这一步的验证是否有必要,当我们结束while循环后的状态是,slow==fast,而nums[slow]或nums[fast]都是没有在上面代码中被判断过是否等于val的,所以我们需要验证nums[slow]是否等于val。
若nums[slow]==val 的话,说明nums[0:slow-1]都是返回值,所以数量为slow。反之,返回slow+1。

学习内容: LC977. 有序数组的平方

题目描述:

个人思路:

第一想法还是对nums平方后选择一种排序算法。
PS:编写过程中发现选择快速排序会导致超出时间限制,归并排序则正常。所以以后尽量使用归并排序。

双指针方法

算法思路:仍是确定两个指针,left和right。由于题目说输出非递减序列,所以输出的只要不是递减序列就可以,即我们只需要将大的数字尽可能地放在后面即可。大数后移则需要用到数字比较和数字交换。因此选用left指针从左向右遍历数字,right指针从右向左遍历数字。
因为这里需要用到交换+比较,如果用for进行遍历还是会导致后面转移到前面的数字是会跳过一次遍历的,导致错误。所以还是要选择while + 条件语句的遍历方法。

class Solution(object):def sortedSquares(self, nums):""":type nums: List[int]:rtype: List[int]"""ans = [-1] * len(nums)left, right = 0, len(nums)-1k = len(nums) - 1while left <= right:ans1 = nums[left] ** 2ans2 = nums[right] ** 2if ans1 < ans2:ans[k] = ans2right -= 1else:ans[k] = ans1left += 1k -= 1return ans

学习内容:LC209. 长度最小的子数组

题目描述:


首先我们需要注意要求:连续子序列大于等于

个人思路:

看到连续子序列的判断一般来说就可以想到滑动窗口。通常情况下,能想到的方法需要两个for循环,一个for用来遍历窗口大小,一个for用来移动窗口位置。但是,这就导致了时间复杂度很大,会超过时间限制。也可以将i,j看作是暴力枚举的起止指针。

for i in range(1, len(nums)+1):     # 用来遍历窗口大小for j in range(len(nums) - i):    # 用来编辑窗口的开始位置if sum(nums[j:j+i]) >= target:return i

显然,这并不是一个好的解决方法。那如何使用一个for循环解决问题呢。

双指针方法\滑动窗口方法

首先只用一个for循环解决问题的话,就需要摒弃常规的思路,就是固定住滑窗的大小然后平行滑动。这必将使用到两个for循环。
1.我们不用长度来表示滑窗而使用窗口的起止位置来表示滑窗大小。
2.用for来固定终止位置,想办法再表示开始位置。
3.滑窗的移动方式不是固定长度的平移,而是先找到满足条件的长度,然后去除开头,直到不满足条件后,加入结尾。(比较难想象)

可以发现每次都是在已经满足条件的内部先去寻找仍满足条件的子序列,这样就可以保证能找到最短的子序列。

def minSubArrayLen(self, target, nums):index = 0    # 起始索引size = 0 res = float('inf')for i in range(len(nums)): # 遍历了终止索引size += nums[i]      # 相当于将后面的元素加入到了滑窗内while size >= target:res = min(res, i-index+1)size -= nums[index]index += 1if res == float('inf'):return 0else:return res

PS.个人认为不能完全当作滑动窗口来看,其实是一种双指针的解法。但是要参考着滑窗的方式更容易理解。

Leetcode Day1---双指针法 || 27移除元素、977. 有序数组的平方、209. 长度最小的子数组相关推荐

  1. 【Leetcode数组--子数组--滑动窗口】209. 长度最小的子数组 904. 水果成篮 1004. 最大连续1的个数 III 76. 最小覆盖子串(有数组操作中重要的方法:滑动窗口!!!!)

    文章目录 Leetcode209 1.问题描述 2.解决方案 解法一:两个错误思路的算法 解法二:暴力 解法三:滑动窗口法(O(n)) Leetcode904 1.问题描述 2.解决方案 Leetco ...

  2. 代码随想录算法训练营第二天|leetcode 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

    leetcode 977.有序数组的平方 想到昨天写的双指针,十分刻意用了一下,感觉还是比较生疏,还得加强练习和思考,然后发现还需要排序,想到了vector的排序sort(),但是觉得直接用不好,也忘 ...

  3. leetcode系列-209.长度最小的子数组

    leetcode系列–第209题.长度最小的子数组 题目描述: 给定一个含有 n 个正整数的数组和一个正整数 target .找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [num ...

  4. 代码随想录算法训练营第二天 | LeetCode 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

    目录 一.今日心得感悟 1.数组从小到大排序 ①冒泡法--时间复杂度:O(nlogn) ②使用排序函数qsort--时间复杂度:O(nlogn) ③两端->中间(双指针法) --时间复杂度:O( ...

  5. 代码随想录算法训练营第二天 | LeetCode 977.有序数组的平方、​LeetCode 209.长度最小的子数组、LeetCode 59.螺旋矩阵II

    LeetCode 977.有序数组的平方 双指针法:数组其实是有序的, 只不过负数平方之后可能成为最大数了.那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间.此时可以考虑双指针法 ...

  6. leetcode —— 209. 长度最小的子数组

    给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度.如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = 7, num ...

  7. leetcode 209. Minimum Size Subarray Sum | 209. 长度最小的子数组(Java)

    题目 https://leetcode.com/problems/minimum-size-subarray-sum/ 题解 双指针解法,左指针和右指针在合适的时候向右走,并维护一个sum 版本1 思 ...

  8. LeetCode—209. 长度最小的子数组

    209. 长度最小的子数组 题目描述:给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ...

  9. LeetCode 209. 长度最小的子数组

    思路: 评论区的大佬太强了,搬运. len 表示 结果:j表示此片段的最左索引:sum表示片段和 先遍历,逐个递加,直到大于s 时,再去缩短长度. public int minSubArrayLen( ...

最新文章

  1. javascript工具类(util)-持续更新
  2. vue 声明周期函数_Vue2.0 探索之路——生命周期和钩子函数的一些理解
  3. 977 AlvinZH过生日(背包DP大作战S)
  4. GraphPad Prism 9.2 科学绘图 最新 可用
  5. 写文件 追加到开始_文件和流
  6. Win10系列:JavaScript动画3
  7. Java基础__Integer类型中的自动装箱
  8. C#学习之泛型功能与限制
  9. mkfs.ext3 快速格式化_求救!固态硬盘格式化不了!
  10. 设置 CentOS linux Numlock默认开启
  11. 揭秘:云控系统运行原理,有效规避风控
  12. cmd 新增dns_用CMD设置IP DNS的方法
  13. [Kerberos基础]-- kerberos认证原理---讲的非常细致,易懂
  14. Macbook M1 安装node(亲测)
  15. 理性看待 数据分析师 Hot!
  16. java中web错误返回码,关于在java程序里调用webservice报500返回码的有关问题
  17. MySQL之——mysqldump参数详细说明
  18. 关于 window.open() referer 非法请求的问题
  19. 606. 根据二叉树创建字符串(视频讲解!!!)
  20. 利用python进行Landsat8数据的辐射定标

热门文章

  1. uni app图片预览
  2. Ubuntu16.04+win10+Fabric
  3. 《李焕英》爆火背后,世界正在奖励那些诚实的人
  4. 华南x79主板u盘装系统教程_华南x79主板怎么装win7系统|华南x79主板装win7及BIOS设置...
  5. AST实战|手把手教你还原ob混淆:ob混淆代码特征
  6. python3网络爬虫:爬取堆糖照片
  7. thinksns源码_看移动社交引擎ThinkSNS如何帮助企业和创业者快速搭建理想的社交产品?...
  8. 太空射击第15课: 道具
  9. Oracle中joint,什么是关节中心化(Joint centration)?
  10. 【wxPython 安装指南:error: legacy-install-failure】