leetcode 392 判断子序列
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"
是"abcde"
的一个子序列,而"aec"
不是)。
输入:s = "abc", t = "ahbgdc" 输出:true
class Solution(object):
def isSubsequence(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
sflag = 0
tflag = 0
while 1:
if tflag > len(t) - 1 or sflag > len(s) - 1:
break
if s[sflag] == t[tflag]:
sflag += 1
tflag += 1
else:
tflag += 1
if sflag == len(s):
return True
else:
return False
leetcode 11 盛水最多的容器
给定一个长度为 n
的整数数组 height
。有 n
条垂线,第 i
条线的两个端点是 (i, 0)
和 (i, height[i])
。
找出其中的两条线,使得它们与 x
轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
输入:[1,8,6,2,5,4,8,3,7] 输出:49 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
其实就是短的那条线与两条线距离围成的长方形面积
双指针,由数组两端向中间移动
不管移动长板还是短板,宽一定减小,而高度由短板决定
所以移动短板:宽减小,高有可能增大,面积有可能增大
移动长板:宽减小,高一定减小,面积一定减小(下一个板更长,高仍然不变;下一个板更短,高就更短)
所以每次移动短板
class Solution(object):
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
left = 0
right = len(height) - 1
maxArea = 0
while left < right:
maxArea = max(maxArea, min(height[left], height[right])*(right - left))
if height[left] > height[right]:
right -= 1
else:
left += 1
return maxArea
leetcode 75 K和数对的最大数目
给你一个整数数组 nums
和一个整数 k
。
每一步操作中,你需要从数组中选出和为 k
的两个整数,并将它们移出数组。
返回你可以对数组执行的最大操作数。
输入:nums = [1,2,3,4], k = 5 输出:2 解释:开始时 nums = [1,2,3,4]: - 移出 1 和 4 ,之后 nums = [2,3] - 移出 2 和 3 ,之后 nums = [] 不再有和为 5 的数对,因此最多执行 2 次操作。
class Solution(object):
def maxOperations(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
numsSort = sorted(nums)
left = 0
right = len(nums) - 1
maxOperations = 0
while left < right:
currentSum = numsSort[left]+numsSort[right]
if currentSum > k:
right -= 1
if currentSum < k:
left += 1
if currentSum == k:
maxOperations += 1
right -= 1
left += 1
return maxOperations
时间太久,算了就这样,摆烂了