一、双指针基础内容
二、滑动窗口基础知识
三、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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。