diff --git a/02_Dynamic-Programming/13. House Robber Problems/01. House Robber I.py b/02_Dynamic-Programming/12. DP Using 1D Array/10. House Robber III.py similarity index 100% rename from 02_Dynamic-Programming/13. House Robber Problems/01. House Robber I.py rename to 02_Dynamic-Programming/12. DP Using 1D Array/10. House Robber III.py diff --git a/02_Dynamic-Programming/12. DP Using 1D Array/10. Delete and Earn.py b/02_Dynamic-Programming/12. DP Using 1D Array/11. Delete and Earn.py similarity index 100% rename from 02_Dynamic-Programming/12. DP Using 1D Array/10. Delete and Earn.py rename to 02_Dynamic-Programming/12. DP Using 1D Array/11. Delete and Earn.py diff --git a/02_Dynamic-Programming/12. DP Using 1D Array/11. Minimum Cost For Tickets.py b/02_Dynamic-Programming/12. DP Using 1D Array/12. Minimum Cost For Tickets.py similarity index 100% rename from 02_Dynamic-Programming/12. DP Using 1D Array/11. Minimum Cost For Tickets.py rename to 02_Dynamic-Programming/12. DP Using 1D Array/12. Minimum Cost For Tickets.py diff --git a/02_Dynamic-Programming/12. DP Using 1D Array/13. Stone Game.py b/02_Dynamic-Programming/12. DP Using 1D Array/13. Stone Game.py new file mode 100644 index 00000000..72a364f3 --- /dev/null +++ b/02_Dynamic-Programming/12. DP Using 1D Array/13. Stone Game.py @@ -0,0 +1,30 @@ +# https://leetcode.com/problems/stone-game/ +# https://youtu.be/uhgdXOlGYqE +''' +class Solution: + def stoneGame(self, piles: List[int]) -> bool: + # as sum(piles) is odd and Alice always choose first so there is always an way + that Alice will win + return True + +''' + +class Solution: + def stoneGame(self, piles: List[int]) -> bool: + dp = {} + + def dfs(l, r): + if l > r: return 0 + + if (l, r) in dp: return dp[(l, r)] + + even = True if (r - l) % 2 == 0 else False + + left = piles[l] if even else 0 + right = piles[r] if even else 0 + + dp[(l, r)] = max(left + dfs(l+1, r), right + dfs(l, r-1)) + + return dp[(l, r)] + + return dfs(0, len(piles)-1) > sum(piles) // 2 \ No newline at end of file diff --git a/02_Dynamic-Programming/12. DP Using 1D Array/14. Stone Game II.py b/02_Dynamic-Programming/12. DP Using 1D Array/14. Stone Game II.py new file mode 100644 index 00000000..9404216f --- /dev/null +++ b/02_Dynamic-Programming/12. DP Using 1D Array/14. Stone Game II.py @@ -0,0 +1,2 @@ +# https://leetcode.com/problems/stone-game-ii/ + diff --git a/02_Dynamic-Programming/13. House Robber Problems/02. House Robber II.py b/02_Dynamic-Programming/13. House Robber Problems/02. House Robber II.py deleted file mode 100644 index e69de29b..00000000 diff --git a/02_Dynamic-Programming/13. House Robber Problems/03. House Robber III.py b/02_Dynamic-Programming/13. House Robber Problems/03. House Robber III.py deleted file mode 100644 index b28b04f6..00000000 --- a/02_Dynamic-Programming/13. House Robber Problems/03. House Robber III.py +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/11_Binary-Search/05. Find Peak Element.py b/11_Binary-Search/05. Find Peak Element.py new file mode 100644 index 00000000..baba0081 --- /dev/null +++ b/11_Binary-Search/05. Find Peak Element.py @@ -0,0 +1,38 @@ +# https://leetcode.com/problems/find-peak-element/ +# https://youtu.be/OINnBJTRrMU + +class Solution: + def findPeakElement(self, nums: List[int]) -> int: + n = len(nums) + if n == 1: return 0 + + low = 0; high = n-1 + + while low <= high: + + mid = low + (high - low) // 2 + # Instead of writting mid = (low + high)//2 we should write mid = low + (high - low)//2 because of INTEGER OVERFLOW in the former case + + if 0 < mid < n-1: + if nums[mid-1] < nums[mid] > nums[mid+1]: + return mid + elif nums[mid-1] > nums[mid]: + high = mid - 1 + else: + low = mid + 1 + + else: + if mid == 0: + if nums[0] > nums[1]: + return 0 + else: + return 1 + if mid == n-1: + if nums[n-1] > nums[n-2]: + return n-1 + else: + return n-2 + +# Time: O(n) +# Space: O(1) + \ No newline at end of file