LeetCode 100 -- Day7
1. 图:207
(1)207 课程表
from collections import deque, defaultdict
class Solution(object):def canFinish(self, numCourses, prerequisites):graph = defaultdict(list)indegree = [0]*numCoursesfor course,pre_course in prerequisites:indegree[course] += 1graph[pre_course].append(course)quene = deque()for i in range(numCourses):if indegree[i]==0:quene.append(i)visited = 0while quene:cur_course = quene.popleft()visited += 1for neighbor in graph[cur_course]:indegree[neighbor] -= 1if indegree[neighbor]==0:quene.append(neighbor)return visited == numCourses
2. 数组:189、238
(1)189 轮转数组
三次反转:
反转整个数组:将数组完全反转,使元素从末尾移动到开头。
反转前
k
个元素:将前k
个元素反转,恢复其原始顺序。反转剩余元素:将剩余
n - k
个元素反转,恢复其原始顺序。
class Solution(object):def reverse(self,nums,start,end):while start<end:nums[start],nums[end] = nums[end],nums[start]start += 1end -= 1def rotate(self, nums, k):n = len(nums)k = k%nif k==0: returnself.reverse(nums,0,n-1)self.reverse(nums,0,k-1)self.reverse(nums,k,n-1)
(2)238 除自身以外数组的乘积
(1)计算左边乘积:
遍历数组,计算每个元素左边所有元素的乘积,并存储在 answer 数组中。
第一个元素的左边乘积为1。
(2)计算右边乘积并合并:
从右向左遍历数组,使用一个变量 right 累积右边元素的乘积。
将 answer 数组中的左边乘积与右边乘积相乘,得到最终结果。
class Solution(object):def productExceptSelf(self, nums):n=len(nums)answer = [1]*nfor i in range(1,n):answer[i] = answer[i-1]*nums[i-1]right = 1for i in range(n-1,-1,-1):answer[i] *= rightright *= nums[i]return answer
3. 贪心:763
(1)763 划分字母区间
(1)遍历字符串,记录每个字符最后出现的位置(字典 {char:last_pos})
(2)再次遍历字符串,使用两个指针:当前片段的开始位置和当前片段的结束位置。
(3)对于每个字符,当前片段的结束位置为 max(当前字符的最后出现位置,当前结束位置)
(4)当遍历到当前片段的结束位置时,表示当前片段可以结束了,记录片段的长度,然后开始下一个片段。
class Solution(object):def partitionLabels(self, s):char_pos = {}for i,char in enumerate(s):char_pos[char] = istart,end = 0,0results = []for i,char in enumerate(s):end = max(end,char_pos[char])if i==end:results.append(end-start+1)start = end+1return results