LeetCode Task04数组双指针、滑动窗口 0344反转字符串 0283移动零 0674最长连续递增序列


一、双指针基础内容

双指针基础内容链接

二、滑动窗口基础知识

滑动窗口基础知识链接

三、0344反转字符串

题目链接
题目描述:

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

示例:
输入:s = [“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]

思路:题目要求只能使用额外的 O ( 1 ) O(1) O(1)的空间,考虑使用双指针去求解。每次使用一个temp变量将两个指针对应的值交换即可。


对撞指针的伪代码如下:

left = 0 
right = len(nums) - 1

while left < right:
    if 满足要求的特殊条件:
        return 符合条件的值 
    elif 一定条件 1:
        left += 1
    elif 一定条件 2:
        right -= 1

return 没找到 或 对应值

本题代码如下:

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        left = 0
        right = len(s)-1
        while left < right:
            temp = s[right]
            s[right] = s[left]
            s[left] = temp
            right -= 1
            left += 1

在这里插入图片描述
官方代码:
由于Python本身的性质,可以不使用temp完成交换

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        for i in range(len(s)//2):
            s[i],s[len(s)-1-i] = s[len(s)-1-i],s[i]

但是效率低了很多,因为每次都要求len(s)。

四、0283移动零

题目链接

题目描述:

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

思路:
仍然使用双指针实现,用left指针指向以保证的非零值的右边,即left的左边能保证都为非零值;right指针作为探索的功能,每次发现非零值就和left指针交换值。直至right指针指向数组最后一个值。

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        left,right = 0,0    #left指针指向最后一个非零数的右边一位,right与left之间都为0
        n = len(nums)
        while right < n:
            if nums[right] != 0:
                nums[left],nums[right] = nums[right],nums[left]
                left += 1
            right += 1

在这里插入图片描述

五、0674最长连续递增序列

题目链接
题目描述

给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。
连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], …, nums[r - 1], nums[r]] 就是连续递增子序列。

示例:
输入:nums = [1,3,5,4,7]
输出:3
解释:最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。

思路:使用贪心的方法来做,从start=0的索引开始,一直计算最大窗口的长度;每次遇到前面的值大于后面的值时,更新start,重新计算窗口长度,遍历完后就能得到最大窗口长度。

代码如下:

class Solution:
    def findLengthOfLCIS(self, nums: List[int]) -> int:
        max_num = 0 #记录目前满足条件的最大的窗口值
        n = len(nums)
        start = 0
        for i in range(n):
            if nums[i] <= nums[i-1]:
                start = i
            max_num = max(max_num,i-start+1)
        return max_num

在这里插入图片描述

官方代码如下:

class Solution:
    def findLengthOfLCIS(self, nums: List[int]) -> int:
        ans = 0
        n = len(nums)
        start = 0

        for i in range(n):
            if i > 0 and nums[i] <= nums[i - 1]:
                start = i
            ans = max(ans, i - start + 1)
        
        return ans

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/longest-continuous-increasing-subsequence/solution/zui-chang-lian-xu-di-zeng-xu-lie-by-leet-dmb8/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值