algorithm/problem solving
leetcode 605(구현), 1302(트리), 56,57(구현, 그리디같은거), 654(트리, 재귀)
qkqhxla1
2021. 3. 20. 22:10
605 leetcode.com/problems/can-place-flowers/
꽃을 심는데 반드시 꽃 사이사이에 한칸씩 공간이 있어야 한다.
class Solution(object): def canPlaceFlowers(self, fb, n): i = 0 while i < len(fb) and n > 0: if i == len(fb) -1 and fb[i-1] == 0 and fb[i] == 0: fb[i] = 1 n -= 1 break elif i < len(fb) -1 and fb[i] == 0 and fb[i+1] == 0: fb[i] = 1 n -= 1 i += 2 elif i < len(fb) -1 and fb[i] == 1 and fb[i+1] == 0: i += 2 else: i += 1 return n == 0
1302 leetcode.com/problems/deepest-leaves-sum/
비슷한 종류의 문제를 많이 풀었다... 트리문제는 대부분 포맷이 비슷비슷한듯...
class Solution(object): def deepestLeavesSum(self, root): all_nodes = [] queue = [[root, 0]] max_depth = 0 while queue: node, depth = queue.pop(0) max_depth = max(max_depth, depth) all_nodes.append([node.val, depth]) for child in [node.left, node.right]: if child: queue.append([child, depth+1]) return sum([n for n,d in all_nodes if d == max_depth])
57 leetcode.com/problems/insert-interval/
좋은 문제인것 같다. 새로운 interval이 들어오면 그걸 넣어서 새 범위를 리턴하는 문제이다. 인터벌 포맷이 그리디 문제에서 자주 보이는 그런 포맷이다.
1. 새 인터벌이 들어오면 이전 인터벌과 합쳐서 시작점을 기준으로 정렬해준다.
2. 새로운 인터벌을 넣을 new_interval을 만든 다음 거기에 앞에서부터 차곡차곡 넣으면서 현 인터벌의 시작점이 마지막으로 넣었던 인터벌의 종료점보다 앞이면 서로 합칠수 있으므로, 합친 다음 새로운 인터벌을 구성한다.
56번 leetcode.com/problems/merge-intervals/도 동일한 소스코드로 풀이가 가능하다.
class Solution(object): def insert(self, intervals, newInterval): #intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]] #newInterval = [4,8] new_interval = [] intervals = sorted(intervals + [newInterval], key=lambda x:x[0]) for i in xrange(len(intervals)): if new_interval and intervals[i][0] <= new_interval[-1][1]: new_interval[-1] = [new_interval[-1][0], max(intervals[i][1], new_interval[-1][1])] else: new_interval.append(intervals[i]) #print 'new =',new_interval return new_interval
654 leetcode.com/problems/maximum-binary-tree/
기본적인 재귀함수 구현하는 문제이다.
class Solution(object): def constructMaximumBinaryTree(self, nums): if not nums: return None root = TreeNode(max(nums)) root.left = self.constructMaximumBinaryTree(nums[:nums.index(max(nums))]) root.right = self.constructMaximumBinaryTree(nums[nums.index(max(nums))+1:]) return root