Example 1:
Input: s = “abcabcbb”
Output: 3
Explanation: The answer is “abc”, with the length of 3.
Example 2:
Input: s = “bbbbb”
Output: 1
Explanation: The answer is “b”, with the length of 1.
Example 3:
Input: s = “pwwkew”
Output: 3
Explanation: The answer is “wke”, with the length of 3.
Notice that the answer must be a substring, “pwke” is a subsequence and not a substring.
Example 4:
Input: s = “”
Output: 0
Constraints:
0 <= s.length <= 5 * 104
s consists of English letters, digits, symbols and spaces.
用two pointer 去走,fast 會先往下走直到遇見重複的,用hashmap記錄遇過的letter,一旦遇到map裡面有的且map裡的index >=slow,就讓slow直接等於 i+1
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
fast, slow = 0, 0
n = len(s)
table = {} res = 0
while fast < n:
if s[fast] in table and table[s[fast]] >= slow:
slow = table[s[fast]] + 1
table[s[fast]] = fast
res = max(res, fast - slow + 1)
fast += 1
return resNotice that you may not slant the container.
Example 1:
Input: height = [1,8,6,2,5,4,8,3,7]
Output: 49
Explanation: The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49.
Example 2:
Input: height = [1,1]
Output: 1
Example 3:
Input: height = [4,3,2,1,4]
Output: 16
Example 4:
Input: height = [1,2,1]
Output: 2
Constraints:
2 <= height.length <= 3 * 104
0 <= height[i] <= 3 * 104
two pointer從左右夾擊,這個概念就是讓width從最大開始,固定width只會越來越小之後,就只要考慮height是否有比現在的大,並且每次只有小的那一邊靠近中間
class Solution(object):
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
""" l, r = 0, len(height) - 1
res = 0
prev_l, prev_r = -1, -1
while l < r:
if height[l] > prev_l or height[r] > prev_r:
amount = min(height[l], height[r]) * (r - l)
res = max(res, amount)
prev_l, prev_r = height[l], height[r]
if height[l] < height[r]: l += 1
else: r -= 1
return resNote:
The solution set must not contain duplicate triplets.
Example:
Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
無法用n次two sum來做,因為two sum只能處理沒有重複解答的問題。這題要用two pointer解決
先sort 這個list,for loop I,然後用l, r從左右夾擊。
一旦找到一對,l+=1, r-=1 ,並且要用while 把重複的都跳過,不然會有重複答案。
如果不是一對
elif nums[l] + nums[r] < target:
l += 1
else:
r -= 1Notice that the solution set must not contain duplicate quadruplets.
Example 1:
Input: nums = [1,0,-1,0,-2,2], target = 0
Output: [[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
Example 2:
Input: nums = [], target = 0
Output: []
Constraints:
0 <= nums.length <= 200
做ksum 遞迴k-2次 for loop然後做two sum
class Solution(object):
def fourSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[List[int]]
"""
if len(nums) < 4: return []
nums.sort()
return self.ksum(nums, target, 4)# -2,-1,0,0,1,2
def ksum(self, nums, target, k):
if len(nums) == 0 or nums[0] * k > target or target > nums[-1] * k:
return []
if k == 2:
return self.twosum(nums, target)
out = []
for i in xrange(len(nums) - (k - 1)):
if i > 0 and nums[i] == nums[i-1]: continue
tmp = target - nums[i]
res = self.ksum(nums[i+1:], tmp, k - 1)
for r in res:
out.append([nums[i]] + r)
return out
def twosum(self, nums, target):
memo = {}
out = []
for i in xrange(len(nums)):
if len(out) == 0 or out[-1][1] != nums[i]:
if target - nums[i] in memo:
out.append([target - nums[i], nums[i]])
memo[nums[i]] = i
return out