双指针--反转字符串,数组拆分,两数之和,移除元素,最大连续1的个数,长度最小子数组

设置首尾两个指针,设置输出条件,首指针后移+1,尾指针前移-1。(常见于排序数组)

1.反转字符串

输入:hello,输出:olleh

class Solution(object):
    def reverseString(self, s):
        i,j=0,len(s)-1
        while i < j:#判断条件很重要
            s[i],s[j]=s[j],s[i]
            i+=1
            j-=1
        return s

2.数组拆分

输入:[1,3,2,4] ,输出:4  (=1+3,[1,2],[3,4])

  • 先排序,在求偶数位置 值的和
class Solution(object):
    def arrayPairSum(self, nums):
        nums.sort()
        n=len(nums)
        aa=0
        i=0
        while i<n-1:
            aa+=nums[i]
            i+=2
        return aa

3.两数之和

输入:[2,7,11,15],输出:9

class Solution(object):
    def twoSum(self, numbers, target):
        i=0
        j=len(numbers)-1
        while i<j:
            sums=numbers[i]+numbers[j]
            if sums==target:
                return [i+1,j+1]
            elif sums<target:
                i+=1
            else:
                j-=1

        return -1
       

不同步指针,同时有一个快指针和慢指针,确定两个指针的移动规则。

4.移除元素

输入:[1,2,2,3],2,输出:[1,3]

class Solution(object):
    def removeElement(self, nums, val):
        slow = 0
        for fast in range(len(nums)):
            if nums[fast]!=val:
                nums[slow]=nums[fast]
                slow+=1
        return slow

5.最大连续1的个数

输入:nums = [1,1,0,1,1,1],输出:3

class Solution(object):
    def findMaxConsecutiveOnes(self, nums):
        one =0
        l=0
        n=len(nums)
        for i in range(n):
            if nums[i]==1:
                one+=1
            else:
                one = 0
            l = max(l,one)
        return l

7.长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

  • 找数组中满足条件的 长度最小的子数组,需要将整个数组都遍历完,用min函数找到最小长度。
  • 这里的连续子数组指的是下标连续的子数组。
  • 涉及到连续子数组的问题,常用二分查找法滑动窗口法。二分查找时间复杂度常为O(NlogN),滑动窗口时间复杂度为O(N)
class Solution(object):
    def minSubArrayLen(self, target, nums):
        left, right = 0, 0
        sums=0
        n=len(nums)  
        count = n+1
        while right < len(nums):
            sums += nums[right]
            while sums >= target:
                count = min(right-left+1, count)
                sums -= nums[left]
                left += 1
            right += 1
        return 0 if count==len(nums)+1 else count 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

icecreamdinner

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值