122 https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/
오랫만에 보는 기초적인 그리디 문제이다.
class Solution(object): def maxProfit(self, prices): if not prices: return 0 p = 0 for i in xrange(1, len(prices)): if prices[i] > prices[i-1]: p += prices[i] - prices[i-1] return p
121 https://leetcode.com/problems/best-time-to-buy-and-sell-stock/
O(n)으로 풀어야 시간초과가 안 걸린다.
class Solution(object): def maxProfit(self, prices): if not prices: return 0 _min,_max = 999999,-1 for i in xrange(len(prices)-1): _min = min(prices[i], _min) # 가격들중 가장 작은 값을 계속 업데이트해준다. _max = max(prices[i+1] - _min, _max) # 뒤에 가격들중 가장 큰 값을 계속 업데이트해준다. return _max if _max != -1 else 0
219 https://leetcode.com/problems/contains-duplicate-ii/
딕셔너리에 nums배열의 값 v에 대해 가장 최신 위치들을 업데이트해준다. 그후 동일한 값이 나타나면 가장 최근의 위치와 현재 위치의 차이를 계산해서 k와 비교한다.
class Solution(object): def containsNearbyDuplicate(self, nums, k): temp = {} for i,v in enumerate(nums): if v not in temp: temp[v] = i elif i - temp[v] <= k: return True temp[v] = i return False
13 https://leetcode.com/problems/roman-to-integer/
구현 문제이다. 주의할 점은 일반적으로 왼쪽부터 오른쪽 순으로 큰 숫자가 먼저 나오는데, 작은 수가 먼저 나올 경우 바로 뒤의 수 - 이전의 수로 해서 계산해야한다는거다. 그래서 IV는 4다. 코드짜는시간보다 문제 이해하는시간이 더 오래걸렸다.
class Solution(object): def romanToInt(self, s): if not s: return 0 roman_dict = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D':500, 'M': 1000} num = 0 i = 0 while i < len(s)-1: if roman_dict[s[i]] < roman_dict[s[i+1]]: num += (roman_dict[s[i+1]] - roman_dict[s[i]]) i += 2 else: num += roman_dict[s[i]] i += 1 if i == len(s)-1: num += roman_dict[s[i]] return num
근데 discussion을 보면 신기한 아이디어가 많다.
1. https://leetcode.com/problems/roman-to-integer/discuss/264743/Clean-Python-beats-99.78.
IV같은건 IIII로 전부 replace해서 그냥 다 더함
2. https://leetcode.com/problems/roman-to-integer/discuss/450264/Python-Beginner-98-fast-100-Memo
거꾸로 돌면서 IV같은건 빼는 로직을 적용함.
'algorithm > problem solving' 카테고리의 다른 글
leetcode 141(find cycle in linked list), 142, 287, 268(missing num) (0) | 2020.04.11 |
---|---|
leetcode 48(rotate), 171(진법 변환?), 168 (0) | 2020.04.11 |
leetcode 283(구현), 108(array to bst), 109, 49(anagram), 438, 567(sliding window) (0) | 2020.04.04 |
leetcode 206(linked list), 92, 238(product), 78(subset, dfs) (0) | 2020.04.03 |
leetcode 230(트리), 22(구현), 17(dfs), 136(xor) (0) | 2020.04.02 |