对角线遍历
示例 1:
输入:mat = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,4,7,5,3,6,8,9]
思路:将矩阵的坐标写出来,由图可以发现,下标加起来为偶数的在一起,下标加起来为奇数的在一起,创建一个数组嵌套5个数组分别存放,在一横排中,下标为奇数的却应该在该坐标的最后一个,偶数的在数组的第一个,于是。。。
class Solution(object): def findDiagonalOrder(self, mat): """ :type mat: List[List[int]] :rtype: List[int] """ l = len(mat) l1 = len(mat[0]) res = [[] for _ in range(l + l1 - 1)] # 建立一个对角线个数的数组用于存放 result = [] for i in range(l): for m in range(l1): # 遍历数组 if (i + m) % 2 != 0: # 为奇数的时候,直接添加到对应(i+m)的数组 res[i + m].append(mat[i][m]) else: res[i + m].insert(0, mat[i][m]) # 下标为偶数的时候,最先遍历到的应该在最后,所以把后加进来的insert到该数组的第一位 for i in res: result += i # 遍历该数组加到一个新的数组 return result
无重复字符的最长子串:
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
思路:使用滑动窗口的办法,遍历字符串,在发现相同的字符之后,那么剔除相同字符串以及之前的字符串,求长度的最大值
class Solution(object): def lengthOfLongestSubstring(self, s): a = [] # 用于临时存放暂未重复的字符 count = 0 # 用于计数a的最长 for i in s: if i in a: a = a[a.index(i) + 1:] # 当发现重复字符串,将该字符串以及之前的字符串剔除 a.append(i) count = max(len(a), count) return count
盛最多水的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
示例 1:
输入:[1,8,6,2,5,4,8,3,7] 输出:49 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
思路:当然,看到题最先想到的是暴力法,O(n2),超时了...
优化之后的思路:主要是使用双指针,盛最多水的容器=min(l,r)*两点距离,两个指针指向两端,然后将小的哪一个向内进行移动,用一个total接收结果,并取得最大值 ,时间复杂度为O(n)
# 暴力法,超时了... class Solution(object): def maxArea(self, height): """ :type height: List[int] :rtype: int """ total = 0 for i in range(len(height)): for m in range(len(height)): if i != m: lowwer = min(height[i], height[m]) total = max(total, lowwer * (m - i)) return total
class Solution(object): def maxArea(self, height): total = 0 left = 0 right = len(height) - 1 while left < right: # 两端移动,荟聚与中间,所以right要大于Left s1 = min(height[left], height[right]) * (right - left) total = max(total, s1) if height[left] > height[right]: #left的数据大于right,移动right right -= 1 else: left += 1 # 否则,移动left return total