设置首尾两个指针,设置输出条件,首指针后移+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