Initial commit — imported from GitHub
This commit is contained in:
commit
169cac6fbc
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
_site
|
||||||
|
.sass-cache
|
||||||
|
.jekyll-cache
|
||||||
|
.jekyll-metadata
|
||||||
|
vendor
|
||||||
|
|
||||||
|
__pycache__
|
||||||
|
*.pyc
|
||||||
|
|
||||||
|
.idea
|
||||||
25
404.html
Normal file
25
404.html
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
---
|
||||||
|
permalink: /404.html
|
||||||
|
layout: default
|
||||||
|
---
|
||||||
|
|
||||||
|
<style type="text/css" media="screen">
|
||||||
|
.container {
|
||||||
|
margin: 10px auto;
|
||||||
|
max-width: 600px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
margin: 30px 0;
|
||||||
|
font-size: 4em;
|
||||||
|
line-height: 1;
|
||||||
|
letter-spacing: -1px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<h1>404</h1>
|
||||||
|
|
||||||
|
<p><strong>Page not found :(</strong></p>
|
||||||
|
<p>The requested page could not be found.</p>
|
||||||
|
</div>
|
||||||
33
Gemfile
Normal file
33
Gemfile
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
source "https://rubygems.org"
|
||||||
|
# Hello! This is where you manage which Jekyll version is used to run.
|
||||||
|
# When you want to use a different version, change it below, save the
|
||||||
|
# file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
|
||||||
|
#
|
||||||
|
# bundle exec jekyll serve
|
||||||
|
#
|
||||||
|
# This will help ensure the proper Jekyll version is running.
|
||||||
|
# Happy Jekylling!
|
||||||
|
gem "jekyll", "~> 4.0.0"
|
||||||
|
# This is the default theme for new Jekyll sites. You may change this to anything you like.
|
||||||
|
# gem "minima", "~> 2.5.1"
|
||||||
|
gem "minima", git: "https://github.com/jekyll/minima"
|
||||||
|
# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
|
||||||
|
# uncomment the line below. To upgrade, run `bundle update github-pages`.
|
||||||
|
# gem "github-pages", group: :jekyll_plugins
|
||||||
|
# If you have any plugins, put them here!
|
||||||
|
group :jekyll_plugins do
|
||||||
|
gem "jekyll-feed", "~> 0.12"
|
||||||
|
end
|
||||||
|
|
||||||
|
# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem
|
||||||
|
# and associated library.
|
||||||
|
install_if -> { RUBY_PLATFORM =~ %r!mingw|mswin|java! } do
|
||||||
|
gem "tzinfo", "~> 1.2"
|
||||||
|
gem "tzinfo-data"
|
||||||
|
end
|
||||||
|
|
||||||
|
# Performance-booster for watching directories on Windows
|
||||||
|
gem "wdm", "~> 0.1.1", :install_if => Gem.win_platform?
|
||||||
|
|
||||||
|
|
||||||
|
gem "webrick", "~> 1.8"
|
||||||
93
Gemfile.lock
Normal file
93
Gemfile.lock
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
GIT
|
||||||
|
remote: https://github.com/jekyll/minima
|
||||||
|
revision: 2863624b903b17f838d6ce8d2f77900fa9d3c864
|
||||||
|
specs:
|
||||||
|
minima (3.0.0.dev)
|
||||||
|
jekyll (>= 3.5, < 5.0)
|
||||||
|
jekyll-feed (~> 0.9)
|
||||||
|
jekyll-seo-tag (~> 2.1)
|
||||||
|
|
||||||
|
GEM
|
||||||
|
remote: https://rubygems.org/
|
||||||
|
specs:
|
||||||
|
addressable (2.8.4)
|
||||||
|
public_suffix (>= 2.0.2, < 6.0)
|
||||||
|
colorator (1.1.0)
|
||||||
|
concurrent-ruby (1.2.2)
|
||||||
|
em-websocket (0.5.3)
|
||||||
|
eventmachine (>= 0.12.9)
|
||||||
|
http_parser.rb (~> 0)
|
||||||
|
eventmachine (1.2.7)
|
||||||
|
ffi (1.15.5)
|
||||||
|
forwardable-extended (2.6.0)
|
||||||
|
http_parser.rb (0.8.0)
|
||||||
|
i18n (1.13.0)
|
||||||
|
concurrent-ruby (~> 1.0)
|
||||||
|
jekyll (4.0.1)
|
||||||
|
addressable (~> 2.4)
|
||||||
|
colorator (~> 1.0)
|
||||||
|
em-websocket (~> 0.5)
|
||||||
|
i18n (>= 0.9.5, < 2)
|
||||||
|
jekyll-sass-converter (~> 2.0)
|
||||||
|
jekyll-watch (~> 2.0)
|
||||||
|
kramdown (~> 2.1)
|
||||||
|
kramdown-parser-gfm (~> 1.0)
|
||||||
|
liquid (~> 4.0)
|
||||||
|
mercenary (~> 0.3.3)
|
||||||
|
pathutil (~> 0.9)
|
||||||
|
rouge (~> 3.0)
|
||||||
|
safe_yaml (~> 1.0)
|
||||||
|
terminal-table (~> 1.8)
|
||||||
|
jekyll-feed (0.17.0)
|
||||||
|
jekyll (>= 3.7, < 5.0)
|
||||||
|
jekyll-sass-converter (2.2.0)
|
||||||
|
sassc (> 2.0.1, < 3.0)
|
||||||
|
jekyll-seo-tag (2.8.0)
|
||||||
|
jekyll (>= 3.8, < 5.0)
|
||||||
|
jekyll-watch (2.2.1)
|
||||||
|
listen (~> 3.0)
|
||||||
|
kramdown (2.4.0)
|
||||||
|
rexml
|
||||||
|
kramdown-parser-gfm (1.1.0)
|
||||||
|
kramdown (~> 2.0)
|
||||||
|
liquid (4.0.4)
|
||||||
|
listen (3.8.0)
|
||||||
|
rb-fsevent (~> 0.10, >= 0.10.3)
|
||||||
|
rb-inotify (~> 0.9, >= 0.9.10)
|
||||||
|
mercenary (0.3.6)
|
||||||
|
pathutil (0.16.2)
|
||||||
|
forwardable-extended (~> 2.6)
|
||||||
|
public_suffix (5.0.1)
|
||||||
|
rb-fsevent (0.11.2)
|
||||||
|
rb-inotify (0.10.1)
|
||||||
|
ffi (~> 1.0)
|
||||||
|
rexml (3.2.5)
|
||||||
|
rouge (3.30.0)
|
||||||
|
safe_yaml (1.0.5)
|
||||||
|
sassc (2.4.0)
|
||||||
|
ffi (~> 1.9)
|
||||||
|
terminal-table (1.8.0)
|
||||||
|
unicode-display_width (~> 1.1, >= 1.1.1)
|
||||||
|
thread_safe (0.3.6)
|
||||||
|
tzinfo (1.2.11)
|
||||||
|
thread_safe (~> 0.1)
|
||||||
|
tzinfo-data (1.2023.3)
|
||||||
|
tzinfo (>= 1.0.0)
|
||||||
|
unicode-display_width (1.8.0)
|
||||||
|
wdm (0.1.1)
|
||||||
|
webrick (1.8.1)
|
||||||
|
|
||||||
|
PLATFORMS
|
||||||
|
ruby
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
jekyll (~> 4.0.0)
|
||||||
|
jekyll-feed (~> 0.12)
|
||||||
|
minima!
|
||||||
|
tzinfo (~> 1.2)
|
||||||
|
tzinfo-data
|
||||||
|
wdm (~> 0.1.1)
|
||||||
|
webrick (~> 1.8)
|
||||||
|
|
||||||
|
BUNDLED WITH
|
||||||
|
2.1.4
|
||||||
21
_code/arrays/bestTimeToBuyAndSellStock.py
Normal file
21
_code/arrays/bestTimeToBuyAndSellStock.py
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import sys
|
||||||
|
|
||||||
|
arr = [7,1,5,3,6,4]
|
||||||
|
# arr = [7,6,4,3,1]
|
||||||
|
# arr = [2,4,1]
|
||||||
|
|
||||||
|
def maxProfit(arr):
|
||||||
|
|
||||||
|
if not arr or len(arr)==0:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
maxProfit = 0
|
||||||
|
for i in range(len(arr)):
|
||||||
|
for j in range(i+1, len(arr)):
|
||||||
|
if arr[j]-arr[i]>maxProfit:
|
||||||
|
maxProfit = arr[j]-arr[i]
|
||||||
|
|
||||||
|
return maxProfit
|
||||||
|
|
||||||
|
|
||||||
|
print(maxProfit(arr))
|
||||||
38
_code/arrays/bestTimeToBuyAndSellStockGlobalMinWrong.py
Normal file
38
_code/arrays/bestTimeToBuyAndSellStockGlobalMinWrong.py
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import sys
|
||||||
|
|
||||||
|
arr = [7,1,5,3,6,4]
|
||||||
|
arr = [7,6,4,3,1]
|
||||||
|
arr = [2,4,1]
|
||||||
|
|
||||||
|
def maxProfit(arr):
|
||||||
|
|
||||||
|
if not arr or len(arr)==0:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
# find lowest pt
|
||||||
|
globalMin = sys.maxsize
|
||||||
|
globalMinIndex = -1
|
||||||
|
for i in range(len(arr)):
|
||||||
|
if arr[i]<globalMin:
|
||||||
|
globalMin=arr[i]
|
||||||
|
globalMinIndex=i
|
||||||
|
|
||||||
|
|
||||||
|
globalMax = -sys.maxsize
|
||||||
|
globalMaxIndex = -1
|
||||||
|
# starting from globalMinIndex, find the max value
|
||||||
|
for i in range(globalMinIndex+1, len(arr)):
|
||||||
|
if arr[i]>globalMax:
|
||||||
|
globalMax=arr[i]
|
||||||
|
globalMaxIndex=i
|
||||||
|
|
||||||
|
print(globalMinIndex, globalMaxIndex)
|
||||||
|
|
||||||
|
if globalMaxIndex!=-1: # a max was found after global min
|
||||||
|
return globalMax-globalMin
|
||||||
|
else:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
print(maxProfit(arr))
|
||||||
40
_code/arrays/findMinInSortedArray.py
Normal file
40
_code/arrays/findMinInSortedArray.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
arr = [4,5,6,7,2,3]
|
||||||
|
|
||||||
|
def findMin(nums):
|
||||||
|
|
||||||
|
# 1-elem array
|
||||||
|
if len(nums)==1:
|
||||||
|
return nums[0]
|
||||||
|
|
||||||
|
left = 0
|
||||||
|
right = len(nums)-1
|
||||||
|
|
||||||
|
# this condition means arr is already sorted, so just return first element
|
||||||
|
if nums[right] > nums[0]:
|
||||||
|
return nums[0]
|
||||||
|
|
||||||
|
|
||||||
|
while right>=left:
|
||||||
|
|
||||||
|
mid = left + (right-left) // 2
|
||||||
|
|
||||||
|
# min found: case 1
|
||||||
|
if nums[mid] > nums[mid+1]: # 3 4 5 1 2 where 5 is mid
|
||||||
|
return nums[mid+1]
|
||||||
|
|
||||||
|
# min found: case 2
|
||||||
|
if nums[mid-1] > nums[mid]: # 4 5 1 2 3 where 1 is mid
|
||||||
|
return nums[mid]
|
||||||
|
|
||||||
|
|
||||||
|
### min not found cases below
|
||||||
|
# mid is greater than first elem so ignore left half
|
||||||
|
if nums[mid] > nums[0]:
|
||||||
|
left = mid+1
|
||||||
|
|
||||||
|
# mid is less than first elem, ignore right half
|
||||||
|
else:
|
||||||
|
right = mid-1
|
||||||
|
|
||||||
|
|
||||||
|
print(findMin(arr))
|
||||||
14
_code/arrays/findMinInSortedArray2.py
Normal file
14
_code/arrays/findMinInSortedArray2.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
arr = [4,5,6,7,2,3]
|
||||||
|
|
||||||
|
def findMin(nums):
|
||||||
|
|
||||||
|
l, r = 0, len(nums) - 1
|
||||||
|
while nums[l] > nums[r]:
|
||||||
|
mid = int((l+r)/2)
|
||||||
|
if nums[mid] >= nums[l]:
|
||||||
|
l = mid + 1
|
||||||
|
else:
|
||||||
|
r = mid
|
||||||
|
return nums[l]
|
||||||
|
|
||||||
|
print(findMin(arr))
|
||||||
24
_code/arrays/increasingTriplet.py
Normal file
24
_code/arrays/increasingTriplet.py
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
nums = [2,5,3,4,5]
|
||||||
|
nums = [6,5,3,4,0]
|
||||||
|
|
||||||
|
def increasingTriplet(nums):
|
||||||
|
|
||||||
|
first = nums[0]
|
||||||
|
second = float('inf')
|
||||||
|
third = float('inf')
|
||||||
|
|
||||||
|
for n in nums:
|
||||||
|
|
||||||
|
if n<first:
|
||||||
|
first = n
|
||||||
|
elif n>first and n<second:
|
||||||
|
second = n
|
||||||
|
elif n>second and n<third:
|
||||||
|
third = n
|
||||||
|
|
||||||
|
print(first, second, third)
|
||||||
|
|
||||||
|
return third!=float('inf')
|
||||||
|
|
||||||
|
|
||||||
|
print(increasingTriplet(nums))
|
||||||
38
_code/arrays/intersectionOfTwoArrays.py
Normal file
38
_code/arrays/intersectionOfTwoArrays.py
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
from typing import List
|
||||||
|
|
||||||
|
class Solution:
|
||||||
|
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
|
||||||
|
|
||||||
|
map = {}
|
||||||
|
for num in nums1:
|
||||||
|
if num not in map:
|
||||||
|
map[num] = 1
|
||||||
|
else:
|
||||||
|
map[num] = map[num] + 1
|
||||||
|
|
||||||
|
|
||||||
|
for k,v in map.items():
|
||||||
|
print( k, v)
|
||||||
|
|
||||||
|
# iter thru num2, if exist in map, minus it
|
||||||
|
res = []
|
||||||
|
for num in nums2:
|
||||||
|
if num in map:
|
||||||
|
res.append(num)
|
||||||
|
if map[num]>1:
|
||||||
|
map[num] = map[num]-1
|
||||||
|
else:
|
||||||
|
map.pop(num)
|
||||||
|
|
||||||
|
print(res)
|
||||||
|
|
||||||
|
# set1 = set(nums1)
|
||||||
|
# set2 = set(nums2)
|
||||||
|
|
||||||
|
# res = set1.intersection(set2)
|
||||||
|
# return list(res)
|
||||||
|
|
||||||
|
|
||||||
|
nums1 = [1,1,2,2]
|
||||||
|
nums2 = [2,2]
|
||||||
|
print( Solution().intersect(nums1, nums2) )
|
||||||
33
_code/arrays/intersectionOfTwoArrays2.py
Normal file
33
_code/arrays/intersectionOfTwoArrays2.py
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
nums1 = [1,2,2,1]
|
||||||
|
nums2 = [2,2]
|
||||||
|
|
||||||
|
|
||||||
|
def intersect(nums1, nums2):
|
||||||
|
|
||||||
|
nums1.sort()
|
||||||
|
nums2.sort()
|
||||||
|
|
||||||
|
i=0
|
||||||
|
j=0
|
||||||
|
|
||||||
|
#1,1,2,2
|
||||||
|
#2,2
|
||||||
|
|
||||||
|
ans = []
|
||||||
|
|
||||||
|
# logic is similar to merging
|
||||||
|
while( i <= len(nums1)-1 and j <= len(nums2)-1 ):
|
||||||
|
|
||||||
|
if nums1[i]==nums2[j]:
|
||||||
|
ans.append(nums1[i])
|
||||||
|
i+=1
|
||||||
|
j+=1
|
||||||
|
elif nums1[i] < nums2[j]:
|
||||||
|
i+=1
|
||||||
|
else:
|
||||||
|
j+=1
|
||||||
|
|
||||||
|
return ans
|
||||||
|
|
||||||
|
|
||||||
|
print( intersect(nums1, nums2) )
|
||||||
37
_code/arrays/longestCommonPrefix.py
Normal file
37
_code/arrays/longestCommonPrefix.py
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
strs = ["flower","flow","flight"]
|
||||||
|
strs = ["c","acc","ccc"]
|
||||||
|
|
||||||
|
|
||||||
|
'''
|
||||||
|
'''
|
||||||
|
def lcp(strs):
|
||||||
|
|
||||||
|
prefix = strs[0]
|
||||||
|
|
||||||
|
for i in range(1, len(strs)):
|
||||||
|
|
||||||
|
# if substring is found, it will return the first index
|
||||||
|
# if that element isn't the first char, then chop off
|
||||||
|
while strs[i].find(prefix) != 0:
|
||||||
|
|
||||||
|
# keep chopping off the last character
|
||||||
|
prefix = prefix[0: len(prefix)-1]
|
||||||
|
if not prefix: return ""
|
||||||
|
|
||||||
|
return prefix
|
||||||
|
|
||||||
|
# for s in strs:
|
||||||
|
|
||||||
|
# # compare s to longest
|
||||||
|
# for i in range(len(s)):
|
||||||
|
# print(s[i], longest[i])
|
||||||
|
# if s[i]==longest[i]:
|
||||||
|
# continue
|
||||||
|
# else:
|
||||||
|
# longest = longest[:i] # cut off longest to length of common characters of s
|
||||||
|
|
||||||
|
# print("longest: ", flower)
|
||||||
|
|
||||||
|
# return prefix
|
||||||
|
|
||||||
|
print( lcp(strs) )
|
||||||
55
_code/arrays/maxProductSubarray.py
Normal file
55
_code/arrays/maxProductSubarray.py
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
arr1 = [2, 3, -2,4]
|
||||||
|
arr2 = [2, 3, 6]
|
||||||
|
arr3 = [2, -3, 6]
|
||||||
|
|
||||||
|
def getMaxProductSubarray(nums):
|
||||||
|
if not nums: return
|
||||||
|
left, right, record = 0, 0, -float('inf')
|
||||||
|
for i in range(len(nums)):
|
||||||
|
left = (left or 1) * nums[i]
|
||||||
|
right = (right or 1) * nums[-i-1]
|
||||||
|
record = max(record, left, right)
|
||||||
|
return record
|
||||||
|
|
||||||
|
def getMaxProductSubarray(arr):
|
||||||
|
|
||||||
|
minCurrent = 1
|
||||||
|
maxCurrent = 1
|
||||||
|
maxRes = -99999
|
||||||
|
|
||||||
|
for i in range(len(arr)):
|
||||||
|
|
||||||
|
current = arr[i]
|
||||||
|
|
||||||
|
print(i, current, minCurrent, maxCurrent)
|
||||||
|
|
||||||
|
if current>0:
|
||||||
|
maxCurrent = maxCurrent * current
|
||||||
|
minCurrent = min( minCurrent * current, 1)
|
||||||
|
elif current==0:
|
||||||
|
maxCurrent=1
|
||||||
|
minCurrent=1
|
||||||
|
else:
|
||||||
|
x = maxCurrent
|
||||||
|
maxCurrent = max( minCurrent * current, 1)
|
||||||
|
minCurrent = x * current
|
||||||
|
|
||||||
|
print(i, current, minCurrent, maxCurrent)
|
||||||
|
|
||||||
|
if maxRes<maxCurrent:
|
||||||
|
maxRes = maxCurrent
|
||||||
|
|
||||||
|
return maxRes
|
||||||
|
|
||||||
|
|
||||||
|
print(arr1)
|
||||||
|
print(getMaxProductSubarray(arr1))
|
||||||
|
print()
|
||||||
|
|
||||||
|
print(arr2)
|
||||||
|
print(getMaxProductSubarray(arr2))
|
||||||
|
print()
|
||||||
|
|
||||||
|
print(arr3)
|
||||||
|
print(getMaxProductSubarray(arr3))
|
||||||
|
print()
|
||||||
21
_code/arrays/maxSubarray.py
Normal file
21
_code/arrays/maxSubarray.py
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
arr = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
|
||||||
|
|
||||||
|
def maxSubarray(arr):
|
||||||
|
|
||||||
|
if not arr:
|
||||||
|
return None
|
||||||
|
|
||||||
|
for i in range(len(arr)):
|
||||||
|
|
||||||
|
if i==0:
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
arr[i] = max(arr[i], arr[i-1] + arr[i]) # max of "start with this elem" or "continue the existing subarray"
|
||||||
|
|
||||||
|
|
||||||
|
return max(arr)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print(maxSubarray(arr))
|
||||||
46
_code/arrays/maximumSubArray.py
Normal file
46
_code/arrays/maximumSubArray.py
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
'''
|
||||||
|
|
||||||
|
Given an array of integers and a number k, find maximum sum of a subarray of size k.
|
||||||
|
|
||||||
|
11:40
|
||||||
|
|
||||||
|
https://medium.com/hackernoon/14-patterns-to-ace-any-coding-interview-question-c5bb3357f6ed#6698
|
||||||
|
https://www.geeksforgeeks.org/find-maximum-minimum-sum-subarray-size-k/
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
# arr = [1,2,3,4,2]
|
||||||
|
# k = 2
|
||||||
|
|
||||||
|
arr = [1, 4, 2, 10, 23, 3, 1, 0, 20]
|
||||||
|
k = 4
|
||||||
|
|
||||||
|
maxSum = 0
|
||||||
|
|
||||||
|
for i in range(0, len(arr)-k+1 ):
|
||||||
|
|
||||||
|
sum = 0
|
||||||
|
|
||||||
|
for j in range(0, k):
|
||||||
|
|
||||||
|
# set j to beginning of window
|
||||||
|
j=i
|
||||||
|
|
||||||
|
sum = sum + arr[j]
|
||||||
|
|
||||||
|
i+=1
|
||||||
|
|
||||||
|
print sum
|
||||||
|
|
||||||
|
if sum > maxSum:
|
||||||
|
maxSum = sum
|
||||||
|
|
||||||
|
print 'max sum is ' + str(maxSum)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
18
_code/arrays/missingNum.py
Normal file
18
_code/arrays/missingNum.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
nums = [3,0,1]
|
||||||
|
|
||||||
|
n = len(nums)
|
||||||
|
|
||||||
|
# sum total if number wasn't missing
|
||||||
|
total = 0
|
||||||
|
for i in range(0, n+1):
|
||||||
|
total = total + i
|
||||||
|
|
||||||
|
|
||||||
|
# sum actual numbers in array
|
||||||
|
arr_total = 0
|
||||||
|
for i in range(0, n):
|
||||||
|
arr_total = arr_total + nums[i]
|
||||||
|
|
||||||
|
print(total)
|
||||||
|
print(arr_total)
|
||||||
|
print(total-arr_total)
|
||||||
53
_code/arrays/pascal_triangle.py
Normal file
53
_code/arrays/pascal_triangle.py
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
'''
|
||||||
|
|
||||||
|
https://leetcode.com/problems/pascals-triangle/
|
||||||
|
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
def generate(numRows):
|
||||||
|
|
||||||
|
triangle = []
|
||||||
|
|
||||||
|
if numRows==0:
|
||||||
|
return []
|
||||||
|
|
||||||
|
# add first row
|
||||||
|
triangle.append([1])
|
||||||
|
|
||||||
|
# add other rows
|
||||||
|
for i in range(1, numRows):
|
||||||
|
|
||||||
|
curr_row = i
|
||||||
|
|
||||||
|
# append placeholders to each row
|
||||||
|
row = []
|
||||||
|
for i in range(0, curr_row+1):
|
||||||
|
|
||||||
|
if i==0:
|
||||||
|
row.append(1)
|
||||||
|
elif i==curr_row:
|
||||||
|
row.append(1)
|
||||||
|
else:
|
||||||
|
# print triangle[curr_row-1][i]
|
||||||
|
# print triangle[curr_row-1][i-1]
|
||||||
|
|
||||||
|
# row.append(None)
|
||||||
|
row.append( triangle[curr_row-1][i] + triangle[curr_row-1][i-1] )
|
||||||
|
|
||||||
|
triangle.append(row)
|
||||||
|
|
||||||
|
|
||||||
|
return triangle
|
||||||
|
|
||||||
|
|
||||||
|
print generate(5)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
29
_code/arrays/plusOne.py
Normal file
29
_code/arrays/plusOne.py
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
digits = [9]
|
||||||
|
|
||||||
|
def plusOne(digits):
|
||||||
|
|
||||||
|
ptr = len(digits)-1
|
||||||
|
carry = 1 # just set carry=1 to do get into the loop
|
||||||
|
|
||||||
|
while carry==1:
|
||||||
|
|
||||||
|
# edge case when carry=1 and ptr goes left off the edge (ie: '9')
|
||||||
|
if ptr<0:
|
||||||
|
digits.insert(0, 1)
|
||||||
|
return digits
|
||||||
|
|
||||||
|
# normal case: just add one to last digit
|
||||||
|
if digits[ptr]>=0 and digits[ptr]<9:
|
||||||
|
digits[ptr] = digits[ptr]+1
|
||||||
|
carry=0
|
||||||
|
return digits
|
||||||
|
|
||||||
|
# edge case, set carry and move left
|
||||||
|
elif digits[ptr]==9:
|
||||||
|
digits[ptr] = 0
|
||||||
|
carry = 1
|
||||||
|
ptr-=1
|
||||||
|
|
||||||
|
return digits
|
||||||
|
|
||||||
|
print( plusOne(digits) )
|
||||||
@ -0,0 +1,36 @@
|
|||||||
|
arr = [0,1,0,1,1,0,0,1]
|
||||||
|
N=1000000000
|
||||||
|
# N=7
|
||||||
|
|
||||||
|
def prisonAfterNDays(arr, N):
|
||||||
|
|
||||||
|
def computeNext(arr):
|
||||||
|
|
||||||
|
arr2 = [0]*len(arr)
|
||||||
|
|
||||||
|
for i in range(1, len(arr)-1):
|
||||||
|
|
||||||
|
# not xor the middle
|
||||||
|
arr2[i] = int(not arr[i-1] ^ arr[i+1])
|
||||||
|
|
||||||
|
# make ends zero
|
||||||
|
arr2[0], arr2[len(arr)-1] = 0,0
|
||||||
|
|
||||||
|
# copy arr2 to arr
|
||||||
|
return arr2.copy()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
seen = {str(arr): N}
|
||||||
|
while N:
|
||||||
|
seen.setdefault(str(arr), N)
|
||||||
|
N -= 1
|
||||||
|
# arr = [0] + [arr[i - 1] ^ arr[i + 1] ^ 1 for i in range(1, 7)] + [0]
|
||||||
|
arr = computeNext(arr)
|
||||||
|
if str(arr) in seen:
|
||||||
|
N %= seen[str(arr)] - N
|
||||||
|
|
||||||
|
return arr
|
||||||
|
|
||||||
|
|
||||||
|
print( prisonAfterNDays(arr, N) )
|
||||||
26
_code/arrays/rotateArray.py
Normal file
26
_code/arrays/rotateArray.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
arr = [1,2,3,4,5,6,7]
|
||||||
|
arr = [-1]
|
||||||
|
arr = [1,2]
|
||||||
|
|
||||||
|
def rotate(nums, k):
|
||||||
|
|
||||||
|
if not nums: return
|
||||||
|
if len(nums) == 1: return
|
||||||
|
|
||||||
|
def reverse(nums, start, end):
|
||||||
|
|
||||||
|
while start < end:
|
||||||
|
tmp = nums[start]
|
||||||
|
nums[start] = nums[end]
|
||||||
|
nums[end] = tmp
|
||||||
|
|
||||||
|
start += 1
|
||||||
|
end -= 1
|
||||||
|
|
||||||
|
reverse(nums, 0, len(nums) - 1)
|
||||||
|
reverse(nums, 0, k - 1)
|
||||||
|
reverse(nums, k, len(nums) - 1)
|
||||||
|
|
||||||
|
rotate(arr, 3)
|
||||||
|
|
||||||
|
print(arr)
|
||||||
19
_code/arrays/searchInRotatedArray.py
Normal file
19
_code/arrays/searchInRotatedArray.py
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
nums = [4,5,6,7,2,3]
|
||||||
|
target = 1
|
||||||
|
|
||||||
|
def search(nums, target):
|
||||||
|
|
||||||
|
left = 0
|
||||||
|
right = len(nums)-1
|
||||||
|
|
||||||
|
# this loop gets left to the smallest element
|
||||||
|
while left<right:
|
||||||
|
|
||||||
|
mid = (left + right) // 2
|
||||||
|
if nums[mid] > nums[right]:
|
||||||
|
left = mid+1
|
||||||
|
else:
|
||||||
|
right = mid
|
||||||
|
|
||||||
|
|
||||||
|
print( search(nums, target) )
|
||||||
36
_code/arrays/squareSortedArrays.py
Normal file
36
_code/arrays/squareSortedArrays.py
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
arr = [-3,-2,-1,0,1,2,3]
|
||||||
|
|
||||||
|
# move ptrs to middle section, j moves forward, i moves backwards
|
||||||
|
j = 0
|
||||||
|
while arr[j]<0:
|
||||||
|
j+=1
|
||||||
|
|
||||||
|
i=j-1
|
||||||
|
|
||||||
|
|
||||||
|
# create new array to store results
|
||||||
|
ans = []
|
||||||
|
while i>=0 and j<len(arr):
|
||||||
|
|
||||||
|
print arr[i]
|
||||||
|
print arr[j]
|
||||||
|
print ''
|
||||||
|
|
||||||
|
if arr[i]**2 < arr[j]**2:
|
||||||
|
ans.append( arr[i]**2 )
|
||||||
|
i-=1
|
||||||
|
else:
|
||||||
|
ans.append( arr[j]**2 )
|
||||||
|
j+=1
|
||||||
|
|
||||||
|
print ans
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
45
_code/arrays/threeSum.py
Normal file
45
_code/arrays/threeSum.py
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
|
||||||
|
|
||||||
|
# ans = []
|
||||||
|
# for i in range(len(nums)):
|
||||||
|
# for j in range(i, len(nums)):
|
||||||
|
# for k in range(j, len(nums)):
|
||||||
|
# if nums[i] + nums[j] + nums[k] == 0:
|
||||||
|
# ans.append([nums[i], nums[j], nums[k]])
|
||||||
|
|
||||||
|
# nums = [-1, 0, 1, 2, -1, -4]
|
||||||
|
nums = [0,0,0,0]
|
||||||
|
|
||||||
|
|
||||||
|
def threeSum(nums):
|
||||||
|
|
||||||
|
nums.sort()
|
||||||
|
output = []
|
||||||
|
|
||||||
|
print(nums)
|
||||||
|
|
||||||
|
index = 0
|
||||||
|
while index<len(nums):
|
||||||
|
|
||||||
|
fixed = nums[index] # -1
|
||||||
|
target = fixed*-1 # want to find 1 in rest of array
|
||||||
|
|
||||||
|
l,r = index+1, len(nums)-1
|
||||||
|
|
||||||
|
while l<r:
|
||||||
|
|
||||||
|
if nums[index] + nums[l] + nums[r] == 0:
|
||||||
|
output.append( [nums[index], nums[l], nums[r]] )
|
||||||
|
|
||||||
|
l+=1
|
||||||
|
r-=1
|
||||||
|
|
||||||
|
|
||||||
|
index+=1
|
||||||
|
|
||||||
|
return output
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print(threeSum(nums))
|
||||||
|
|
||||||
34
_code/arrays/twoCityScheduling.py
Normal file
34
_code/arrays/twoCityScheduling.py
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
costs = [
|
||||||
|
[10,20],
|
||||||
|
[30,200],
|
||||||
|
[400,50],
|
||||||
|
[30,20]
|
||||||
|
]
|
||||||
|
|
||||||
|
def minCosts(costs):
|
||||||
|
|
||||||
|
n = len(costs)//2
|
||||||
|
|
||||||
|
# calculate the difference between city A and city B for each person
|
||||||
|
delta = [(a - b) for a, b in costs]
|
||||||
|
print( "delta: ", delta )
|
||||||
|
|
||||||
|
# get the ordered difference
|
||||||
|
ordered_delta = sorted((value, i) for (i, value) in enumerate(delta))
|
||||||
|
print( "ordered delta:", ordered_delta )
|
||||||
|
|
||||||
|
minimum_cost = 0
|
||||||
|
|
||||||
|
# for the n smallest cost_A - cost_B, it costs a lot to fly to B,
|
||||||
|
# so we send them to city A
|
||||||
|
print( "ordered_delta[:n] ", ordered_delta[:n] )
|
||||||
|
for value, i in ordered_delta[:n]:
|
||||||
|
minimum_cost += costs[i][0]
|
||||||
|
|
||||||
|
# for the n greatest cost_A - cost_B, it costs a lot to fly to A,
|
||||||
|
# so we send them to city B
|
||||||
|
for value, i in ordered_delta[n:]:
|
||||||
|
minimum_cost += costs[i][1]
|
||||||
|
return minimum_cost
|
||||||
|
|
||||||
|
print( minCosts(costs) )
|
||||||
20
_code/arrays/twoSum.py
Normal file
20
_code/arrays/twoSum.py
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
nums = [2, 7, 11, 15]
|
||||||
|
target = 26
|
||||||
|
|
||||||
|
|
||||||
|
def twoSum(nums, target):
|
||||||
|
|
||||||
|
length = len(nums)
|
||||||
|
for i in range(0, length):
|
||||||
|
for j in range(i+1, length):
|
||||||
|
|
||||||
|
if nums[i] + nums[j] == target:
|
||||||
|
|
||||||
|
return (i, j)
|
||||||
|
break
|
||||||
|
|
||||||
|
j=j+1
|
||||||
|
|
||||||
|
|
||||||
|
res = twoSum(nums, target)
|
||||||
|
print res
|
||||||
17
_code/arrays/twoSumOnePass.py
Normal file
17
_code/arrays/twoSumOnePass.py
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
nums = [2, 7, 11, 15]
|
||||||
|
target = 9
|
||||||
|
|
||||||
|
|
||||||
|
def twoSum(nums, target):
|
||||||
|
|
||||||
|
seen = {}
|
||||||
|
for i, v in enumerate(nums):
|
||||||
|
remaining = target - v
|
||||||
|
if remaining in seen:
|
||||||
|
return [seen[remaining], i]
|
||||||
|
seen[v] = i
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
|
res = twoSum(nums, target)
|
||||||
|
print (res)
|
||||||
26
_code/arrays/waterWithMostArea.py
Normal file
26
_code/arrays/waterWithMostArea.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
height = [1,8,6,2,5,4,8,3,7]
|
||||||
|
|
||||||
|
def maxArea(height):
|
||||||
|
|
||||||
|
left = 0
|
||||||
|
right = len(height)-1
|
||||||
|
|
||||||
|
maxArea = 0
|
||||||
|
|
||||||
|
while left<right:
|
||||||
|
|
||||||
|
minHeight = min( height[left], height[right] )
|
||||||
|
distance = right-left
|
||||||
|
|
||||||
|
maxArea = max( maxArea, minHeight*distance )
|
||||||
|
|
||||||
|
# move shorter one inward
|
||||||
|
if height[left]<height[right]:
|
||||||
|
left+=1
|
||||||
|
else:
|
||||||
|
right-=1
|
||||||
|
|
||||||
|
return maxArea
|
||||||
|
|
||||||
|
|
||||||
|
print(maxArea(height))
|
||||||
34
_code/backtracking/backtrack.py
Normal file
34
_code/backtracking/backtrack.py
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
import sys
|
||||||
|
|
||||||
|
sys.setrecursionlimit(10)
|
||||||
|
|
||||||
|
nums = [1,2,3]
|
||||||
|
|
||||||
|
def permute(nums):
|
||||||
|
|
||||||
|
output = []
|
||||||
|
|
||||||
|
def backtrack(currentList):
|
||||||
|
|
||||||
|
print(currentList)
|
||||||
|
|
||||||
|
# base case
|
||||||
|
if len(currentList)==len(nums):
|
||||||
|
output.append(currentList.copy())
|
||||||
|
|
||||||
|
# imagine you're at [1] (your currentList) and you want to append 1,2,3 to your child branches
|
||||||
|
# so they become 11, 12, 13
|
||||||
|
for i in range(0, len(nums)):
|
||||||
|
|
||||||
|
if nums[i] in currentList:
|
||||||
|
continue
|
||||||
|
|
||||||
|
currentList.append(nums[i])
|
||||||
|
backtrack(currentList)
|
||||||
|
currentList.pop()
|
||||||
|
|
||||||
|
backtrack([])
|
||||||
|
return output
|
||||||
|
|
||||||
|
|
||||||
|
print( permute(nums) )
|
||||||
22
_code/backtracking/combination_sum.py
Normal file
22
_code/backtracking/combination_sum.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
candidates = [2,3,6,7]
|
||||||
|
target = 7
|
||||||
|
|
||||||
|
def combinationSum(candidates, target):
|
||||||
|
|
||||||
|
def backtrack(currentList, nums, start):
|
||||||
|
|
||||||
|
if sum(currentList)==target:
|
||||||
|
allValidCombos.append( currentList.copy() )
|
||||||
|
return
|
||||||
|
if sum(currentList) > target: # optimization
|
||||||
|
return
|
||||||
|
for i in range(start, len(nums)):
|
||||||
|
backtrack(currentList + [nums[i]], nums, i)
|
||||||
|
# currentList.append( nums[i] )
|
||||||
|
# backtrack( currentList, nums, start)
|
||||||
|
|
||||||
|
allValidCombos = []
|
||||||
|
backtrack([], candidates, 0 )
|
||||||
|
return allValidCombos
|
||||||
|
|
||||||
|
print( combinationSum(candidates, target) )
|
||||||
25
_code/backtracking/generateParenthesis.py
Normal file
25
_code/backtracking/generateParenthesis.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
n=3
|
||||||
|
|
||||||
|
def generateParenthesis(n):
|
||||||
|
|
||||||
|
def backtrack(outputList, currentString, open, close, n):
|
||||||
|
|
||||||
|
if len(currentString)==2*n:
|
||||||
|
outputList.append(currentString)
|
||||||
|
print("output " + currentString)
|
||||||
|
return
|
||||||
|
|
||||||
|
print( currentString )
|
||||||
|
|
||||||
|
if open < n:
|
||||||
|
backtrack( outputList, currentString+"(", open+1, close, n )
|
||||||
|
|
||||||
|
if close < open:
|
||||||
|
backtrack( outputList, currentString+")", open, close+1, n)
|
||||||
|
|
||||||
|
outputList = []
|
||||||
|
backtrack( outputList, "", 0, 0, n)
|
||||||
|
return outputList
|
||||||
|
|
||||||
|
|
||||||
|
print( generateParenthesis(n) )
|
||||||
47
_code/backtracking/permutation.py
Normal file
47
_code/backtracking/permutation.py
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
# nums = [10,20,30]
|
||||||
|
nums = [1,1,2]
|
||||||
|
|
||||||
|
def permute1(nums):
|
||||||
|
|
||||||
|
def backtrack(currentList, allPermutations, nums):
|
||||||
|
|
||||||
|
if len(currentList)==len(nums):
|
||||||
|
allPermutations.append(currentList[:]) # or currentList.copy() because Python passes by reference
|
||||||
|
else:
|
||||||
|
for i in range(0, len(nums)):
|
||||||
|
if nums[i] in currentList:
|
||||||
|
continue
|
||||||
|
currentList.append(nums[i])
|
||||||
|
backtrack( currentList, allPermutations, nums )
|
||||||
|
currentList.remove(currentList[-1]) # currentList.pop() also does the same thing
|
||||||
|
|
||||||
|
|
||||||
|
allPermutations = []
|
||||||
|
backtrack([], allPermutations, nums)
|
||||||
|
return allPermutations
|
||||||
|
|
||||||
|
|
||||||
|
def permute2(nums):
|
||||||
|
|
||||||
|
def backtrack(currentList, allPermutations, nums):
|
||||||
|
|
||||||
|
if len(currentList)==len(nums):
|
||||||
|
allPermutations.append(currentList.copy())
|
||||||
|
else:
|
||||||
|
for i in range(len(nums)):
|
||||||
|
|
||||||
|
currentList.append(nums[i])
|
||||||
|
print(currentList)
|
||||||
|
|
||||||
|
backtrack(currentList, allPermutations, nums)
|
||||||
|
currentList.pop()
|
||||||
|
print(currentList)
|
||||||
|
|
||||||
|
|
||||||
|
allPermutations = []
|
||||||
|
backtrack([], allPermutations, nums)
|
||||||
|
return allPermutations
|
||||||
|
|
||||||
|
# print(permute1(nums))
|
||||||
|
# print()
|
||||||
|
print(permute2(nums))
|
||||||
130
_code/backtracking/subsets.py
Normal file
130
_code/backtracking/subsets.py
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
nums = [1,2,3]
|
||||||
|
|
||||||
|
|
||||||
|
# def subsets(nums):
|
||||||
|
|
||||||
|
# def backtrack(first = 0, curr = []):
|
||||||
|
# # if the combination is done
|
||||||
|
# if len(curr) == k:
|
||||||
|
# output.append(curr[:])
|
||||||
|
# for i in range(first, n):
|
||||||
|
# # add nums[i] into the current combination
|
||||||
|
# curr.append(nums[i])
|
||||||
|
# # use next integers to complete the combination
|
||||||
|
# backtrack(i + 1, curr)
|
||||||
|
# # backtrack
|
||||||
|
# curr.pop()
|
||||||
|
|
||||||
|
# output = []
|
||||||
|
# n = len(nums)
|
||||||
|
# for k in range(n + 1):
|
||||||
|
# backtrack()
|
||||||
|
# return output
|
||||||
|
|
||||||
|
|
||||||
|
def subsets(nums):
|
||||||
|
subsets = []
|
||||||
|
|
||||||
|
def generateSubsets(index, nums, current, subsets):
|
||||||
|
subsets.append(current[:])
|
||||||
|
for i in range(index, len(nums)):
|
||||||
|
current.append(nums[i])
|
||||||
|
generateSubsets(i + 1, nums, current, subsets)
|
||||||
|
current.remove(current[-1])
|
||||||
|
|
||||||
|
generateSubsets(0, nums, [], subsets)
|
||||||
|
return subsets
|
||||||
|
|
||||||
|
|
||||||
|
def subsets2(nums):
|
||||||
|
|
||||||
|
def backtrack(startIndex, currentSubset, allSubsets, nums):
|
||||||
|
|
||||||
|
allSubsets.append(currentSubset[:])
|
||||||
|
|
||||||
|
for i in range(startIndex, len(nums)):
|
||||||
|
currentSubset.append(nums[i])
|
||||||
|
print(currentSubset)
|
||||||
|
|
||||||
|
backtrack( i+1, currentSubset, allSubsets, nums)
|
||||||
|
|
||||||
|
currentSubset.remove( currentSubset[-1] )
|
||||||
|
print(currentSubset)
|
||||||
|
|
||||||
|
allSubsets = []
|
||||||
|
backtrack( 0, [], allSubsets, nums )
|
||||||
|
return allSubsets
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def subsets3(nums):
|
||||||
|
|
||||||
|
def backtrack(currentSubset, allSubsets, nums, index):
|
||||||
|
|
||||||
|
allSubsets.append( currentSubset.copy() )
|
||||||
|
|
||||||
|
for i in range(index, len(nums)):
|
||||||
|
|
||||||
|
currentSubset.append(nums[i])
|
||||||
|
print(currentSubset)
|
||||||
|
|
||||||
|
backtrack( currentSubset, allSubsets, nums, i+1 )
|
||||||
|
currentSubset.pop()
|
||||||
|
print(currentSubset)
|
||||||
|
|
||||||
|
|
||||||
|
ans = []
|
||||||
|
backtrack([], ans, nums, 0)
|
||||||
|
return ans
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
'''
|
||||||
|
recursion without backtracking from timonthy chang
|
||||||
|
https://www.youtube.com/watch?v=Mi_C_CMW7vQ
|
||||||
|
'''
|
||||||
|
def subsets4(nums):
|
||||||
|
|
||||||
|
output = []
|
||||||
|
|
||||||
|
def helper(start, currentSubset, output):
|
||||||
|
# output += [tmp]
|
||||||
|
output.append(currentSubset)
|
||||||
|
for i in range(start, len(nums)):
|
||||||
|
print( (i+1, currentSubset+[nums[i]]) )
|
||||||
|
helper( i+1, currentSubset+[nums[i]], output )
|
||||||
|
|
||||||
|
helper(0, [], output)
|
||||||
|
|
||||||
|
return output
|
||||||
|
|
||||||
|
|
||||||
|
def subsets5(nums):
|
||||||
|
|
||||||
|
def helper(start, currentSubset, allSubsets):
|
||||||
|
|
||||||
|
output.append( currentSubset.copy() )
|
||||||
|
|
||||||
|
for i in range(start, len(nums) ):
|
||||||
|
|
||||||
|
currentSubset.append( nums[i] )
|
||||||
|
print(i+1, currentSubset)
|
||||||
|
helper(i+1, currentSubset, output)
|
||||||
|
currentSubset.pop()
|
||||||
|
|
||||||
|
output = []
|
||||||
|
helper(0, [], output)
|
||||||
|
return output
|
||||||
|
|
||||||
|
|
||||||
|
'''
|
||||||
|
https://medium.com/leetcode-patterns/leetcode-pattern-3-backtracking-5d9e5a03dc26
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
# print(subsets2(nums))
|
||||||
|
# print()
|
||||||
|
# print(subsets3(nums))
|
||||||
|
print(subsets4(nums))
|
||||||
|
print(subsets5(nums))
|
||||||
69
_code/bfs/bfs.py
Normal file
69
_code/bfs/bfs.py
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
class TreeNode:
|
||||||
|
|
||||||
|
def __init__(self, val):
|
||||||
|
|
||||||
|
self.val = val
|
||||||
|
self.left = None
|
||||||
|
self.right = None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def levelOrder(root):
|
||||||
|
|
||||||
|
q = [root]
|
||||||
|
ans = []
|
||||||
|
|
||||||
|
|
||||||
|
while q:
|
||||||
|
|
||||||
|
level_size = len(q)
|
||||||
|
level = []
|
||||||
|
|
||||||
|
for i in range(level_size):
|
||||||
|
|
||||||
|
curr = q.pop(0)
|
||||||
|
|
||||||
|
level.append(curr.val)
|
||||||
|
|
||||||
|
if curr.left:
|
||||||
|
q.append(curr.left)
|
||||||
|
if curr.right:
|
||||||
|
q.append(curr.right)
|
||||||
|
|
||||||
|
if level:
|
||||||
|
ans.append(level)
|
||||||
|
|
||||||
|
return ans[::-1]
|
||||||
|
|
||||||
|
# q = [root]
|
||||||
|
# ans = []
|
||||||
|
|
||||||
|
# while q:
|
||||||
|
|
||||||
|
# level_size = len(q)
|
||||||
|
# level = []
|
||||||
|
|
||||||
|
# for _ in range(level_size):
|
||||||
|
|
||||||
|
# curr = q.pop(0)
|
||||||
|
# level.append(curr.val)
|
||||||
|
|
||||||
|
# if curr.left:
|
||||||
|
# q.append(curr.left)
|
||||||
|
# if curr.right:
|
||||||
|
# q.append(curr.right)
|
||||||
|
|
||||||
|
# ans.append(level)
|
||||||
|
|
||||||
|
# return ans[::-1]
|
||||||
|
|
||||||
|
root = TreeNode(3)
|
||||||
|
root.left = TreeNode(9)
|
||||||
|
root.right = TreeNode(20)
|
||||||
|
# root.left.left = TreeNode(4)
|
||||||
|
# root.left.right = TreeNode(5)
|
||||||
|
root.right.left = TreeNode(15)
|
||||||
|
root.right.right = TreeNode(7)
|
||||||
|
# root.right.right.right = TreeNode(8)
|
||||||
|
|
||||||
|
print( levelOrder(root) )
|
||||||
21
_code/binary search/arrangecoins.py
Normal file
21
_code/binary search/arrangecoins.py
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
|
||||||
|
n=5
|
||||||
|
|
||||||
|
def arrangeCoins(n):
|
||||||
|
l = 1
|
||||||
|
h = n
|
||||||
|
while l<=h:
|
||||||
|
mid = l + (h-l)//2
|
||||||
|
temp = int(mid*(mid+1)/2)
|
||||||
|
|
||||||
|
print(l, mid, h, temp, [ (x*(x+1)//2) for x in range(l,h)])
|
||||||
|
|
||||||
|
if temp == n:
|
||||||
|
return mid
|
||||||
|
if temp < n:
|
||||||
|
l = mid + 1
|
||||||
|
else:
|
||||||
|
h = mid - 1
|
||||||
|
return h
|
||||||
|
|
||||||
|
print(arrangeCoins(n))
|
||||||
32
_code/binary search/binarySearch.py
Normal file
32
_code/binary search/binarySearch.py
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# arr = [1,2,3,4,5,6,7,8,9,10]
|
||||||
|
arr = [-1,0,3,5,9,12]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def binSearch(low, high, arr, target):
|
||||||
|
|
||||||
|
while low<=high:
|
||||||
|
|
||||||
|
print(low, high, arr, target)
|
||||||
|
|
||||||
|
mid = int((low+high)/2)
|
||||||
|
# mid = low+high//2
|
||||||
|
|
||||||
|
if arr[mid]==target:
|
||||||
|
return mid
|
||||||
|
|
||||||
|
# if target is greater, ignore left half
|
||||||
|
elif arr[mid]<target:
|
||||||
|
low = mid+1
|
||||||
|
|
||||||
|
|
||||||
|
# if target is less, ignore right half
|
||||||
|
else:
|
||||||
|
high = mid-1
|
||||||
|
|
||||||
|
|
||||||
|
return -1
|
||||||
|
|
||||||
|
res = binSearch(0, len(arr), arr, 13)
|
||||||
|
print(res)
|
||||||
|
|
||||||
28
_code/binary search/binarySearch2.py
Normal file
28
_code/binary search/binarySearch2.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
arr = [1,2,3,4,5]
|
||||||
|
|
||||||
|
|
||||||
|
def binarySearch(left, right, arr, target):
|
||||||
|
|
||||||
|
print(left, right, arr, target)
|
||||||
|
print( right, left, right<=left )
|
||||||
|
|
||||||
|
while left<=right:
|
||||||
|
|
||||||
|
|
||||||
|
print(left, right, arr, target)
|
||||||
|
|
||||||
|
mid = int((left+right)/2)
|
||||||
|
# mid = left+right//2
|
||||||
|
|
||||||
|
if arr[mid]==target:
|
||||||
|
return mid
|
||||||
|
|
||||||
|
elif target>arr[mid]:
|
||||||
|
left = mid+1
|
||||||
|
else:
|
||||||
|
right = mid-1
|
||||||
|
|
||||||
|
return -1
|
||||||
|
|
||||||
|
|
||||||
|
print(binarySearch(0, len(arr)-1, arr, 4))
|
||||||
41
_code/binary search/searchInsertPosition.py
Normal file
41
_code/binary search/searchInsertPosition.py
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
def searchInsert(nums, target):
|
||||||
|
|
||||||
|
left = 0
|
||||||
|
right = len(nums)-1
|
||||||
|
|
||||||
|
while left<=right:
|
||||||
|
|
||||||
|
mid = (left+right)//2
|
||||||
|
|
||||||
|
if target==nums[mid]:
|
||||||
|
return mid
|
||||||
|
|
||||||
|
# # left and right beside each other
|
||||||
|
# elif right-left<=1:
|
||||||
|
|
||||||
|
# # and target is inbetween (ie: [4,6], tar=5)
|
||||||
|
# if target>=nums[left] and target<=nums[right]:
|
||||||
|
# return left+1
|
||||||
|
|
||||||
|
# # target is outside of array (to the right)
|
||||||
|
# elif target>nums[right]:
|
||||||
|
# return right+1
|
||||||
|
|
||||||
|
# # target is outside of array (to the left)
|
||||||
|
# elif target<nums[left]:
|
||||||
|
# return left
|
||||||
|
|
||||||
|
elif target>nums[mid]:
|
||||||
|
left = mid+1
|
||||||
|
elif target<nums[mid]:
|
||||||
|
right = mid-1
|
||||||
|
|
||||||
|
return left
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print( searchInsert( [1,3,5,6] , 5) ) # 2
|
||||||
|
print( searchInsert( [1,3,4,6] , 5) ) # 3
|
||||||
|
print( searchInsert( [1,2] , 3) ) # 2
|
||||||
|
print( searchInsert( [1,2] , 0) ) # 0
|
||||||
|
print( searchInsert( [1,3] , 2) ) # 1
|
||||||
35
_code/binary search/searchMatrix.py
Normal file
35
_code/binary search/searchMatrix.py
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# mat = [
|
||||||
|
# [1,2,3,4],
|
||||||
|
# [5,6,7,8],
|
||||||
|
# [9,10,11,12]
|
||||||
|
# ]
|
||||||
|
|
||||||
|
mat = [[1,3,5,7],[10,11,16,20],[23,30,34,50]]
|
||||||
|
mat = [[1,3,5,7],[10,11,16,20],[23,30,34,50]]
|
||||||
|
|
||||||
|
def searchMatrix(mat, target):
|
||||||
|
|
||||||
|
rows = len(mat)
|
||||||
|
cols = len(mat[0])
|
||||||
|
|
||||||
|
start = 0
|
||||||
|
end = rows * cols - 1
|
||||||
|
|
||||||
|
while start<=end:
|
||||||
|
|
||||||
|
mid = (start+end)//2 # this would be the mid if it was a 1d array
|
||||||
|
row = mid // cols
|
||||||
|
col = mid % cols
|
||||||
|
val=mat[row][col]
|
||||||
|
|
||||||
|
if val==target:
|
||||||
|
return True
|
||||||
|
elif val<target:
|
||||||
|
start=mid+1
|
||||||
|
else:
|
||||||
|
end=mid-1
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
print(searchMatrix(mat, 13))
|
||||||
14
_code/bit manipulation/addBinaryStrings.py
Normal file
14
_code/bit manipulation/addBinaryStrings.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# print( bin(4).replace("0b", "") )
|
||||||
|
|
||||||
|
|
||||||
|
a = "1010"
|
||||||
|
b = "1011"
|
||||||
|
|
||||||
|
decA = int(a, 2)
|
||||||
|
decB = int(b, 2)
|
||||||
|
|
||||||
|
print(decA, decB, decA+decB, bin(decA+decB))
|
||||||
|
|
||||||
|
res = bin( decA + decB ).replace("0b", "")
|
||||||
|
|
||||||
|
print(res)
|
||||||
38
_code/bit manipulation/binaryToInt.py
Normal file
38
_code/bit manipulation/binaryToInt.py
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
|
||||||
|
class Node:
|
||||||
|
|
||||||
|
def __init__(self, val):
|
||||||
|
self.val = val
|
||||||
|
self.next = None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def getCount(head):
|
||||||
|
|
||||||
|
count = 0
|
||||||
|
while head:
|
||||||
|
count = count + 1
|
||||||
|
head = head.next
|
||||||
|
return count
|
||||||
|
|
||||||
|
|
||||||
|
def binToInt(head):
|
||||||
|
|
||||||
|
sum = 0
|
||||||
|
count = getCount(head) - 1
|
||||||
|
|
||||||
|
while head:
|
||||||
|
sum = sum + ( (2**count) * head.val )
|
||||||
|
count = count-1
|
||||||
|
head = head.next
|
||||||
|
|
||||||
|
return sum
|
||||||
|
|
||||||
|
|
||||||
|
head = Node(1)
|
||||||
|
head.next = Node(0)
|
||||||
|
head.next.next = Node(1)
|
||||||
|
|
||||||
|
print( getCount(head) )
|
||||||
|
print( binToInt(head) )
|
||||||
44
_code/bit manipulation/countOnesInArray.py
Normal file
44
_code/bit manipulation/countOnesInArray.py
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
'''
|
||||||
|
https://leetcode.com/problems/counting-bits/
|
||||||
|
|
||||||
|
Problem:
|
||||||
|
|
||||||
|
Given num, return array which contains numOnes
|
||||||
|
Ie, input = 2, return [0,1,1]
|
||||||
|
|
||||||
|
Do it in O(n) time, and not O(n*numBits)
|
||||||
|
|
||||||
|
Solution: dynamic programming (build table bottom up)
|
||||||
|
|
||||||
|
d[i] = d[i//2] + (i%2)
|
||||||
|
|
||||||
|
ex:
|
||||||
|
d[3] = d[3//2] + 3%2
|
||||||
|
= d[1] + 1
|
||||||
|
= 2
|
||||||
|
d[6] = d[6//2] + 6%2
|
||||||
|
= d[3] + 0
|
||||||
|
= 2 + 0
|
||||||
|
= 2
|
||||||
|
d[7] = d[7//2] + 7%2
|
||||||
|
= d[3] + 1
|
||||||
|
= 2 + 1 = 3
|
||||||
|
|
||||||
|
https://leetcode.com/problems/counting-bits/discuss/626777/Easy-DP-Explanation-%3A-Python-Solution
|
||||||
|
'''
|
||||||
|
|
||||||
|
def countOnes(num):
|
||||||
|
|
||||||
|
if num==0: return [0]
|
||||||
|
if num==1: return [0,1]
|
||||||
|
|
||||||
|
|
||||||
|
dp=[0,1]
|
||||||
|
|
||||||
|
for i in range(2, num+1):
|
||||||
|
# dp[i] = dp[i//2] + (i%2)
|
||||||
|
dp.append( dp[i//2] + (i%2) )
|
||||||
|
|
||||||
|
return dp
|
||||||
|
|
||||||
|
print(countOnes(2))
|
||||||
14
_code/bit manipulation/hammingDistance.py
Normal file
14
_code/bit manipulation/hammingDistance.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
x = 1
|
||||||
|
y = 3
|
||||||
|
|
||||||
|
|
||||||
|
tmp = x ^ y
|
||||||
|
|
||||||
|
count=0
|
||||||
|
while tmp>0:
|
||||||
|
if tmp&1==1:
|
||||||
|
count+=1
|
||||||
|
tmp>>=1
|
||||||
|
|
||||||
|
|
||||||
|
print( count )
|
||||||
12
_code/bit manipulation/hammingWeight.py
Normal file
12
_code/bit manipulation/hammingWeight.py
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
def hammingWeight(self, n: int) -> int:
|
||||||
|
|
||||||
|
count = 0
|
||||||
|
while n>0:
|
||||||
|
|
||||||
|
if n&1==1:
|
||||||
|
count+=1
|
||||||
|
|
||||||
|
n>>=1
|
||||||
|
|
||||||
|
return count
|
||||||
|
|
||||||
13
_code/bit manipulation/missingNumXor.py
Normal file
13
_code/bit manipulation/missingNumXor.py
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
nums = [3,0,1]
|
||||||
|
|
||||||
|
n = len(nums)
|
||||||
|
|
||||||
|
# xor index with value
|
||||||
|
xor = 0
|
||||||
|
for i, num in enumerate(nums):
|
||||||
|
xor ^= i^num
|
||||||
|
|
||||||
|
# xor with length gives you missing num
|
||||||
|
missing = xor^n
|
||||||
|
|
||||||
|
print(missing)
|
||||||
26
_code/bit manipulation/reverseBits.py
Normal file
26
_code/bit manipulation/reverseBits.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def reverseBits(str):
|
||||||
|
|
||||||
|
n = int(str)
|
||||||
|
|
||||||
|
rev = 0
|
||||||
|
|
||||||
|
# tranverse bits from right to left
|
||||||
|
while n>0:
|
||||||
|
|
||||||
|
rev = rev << 1
|
||||||
|
|
||||||
|
# if current bit is 1
|
||||||
|
if (n&1==1):
|
||||||
|
rev = rev ^ 1
|
||||||
|
|
||||||
|
n = n >> 1
|
||||||
|
|
||||||
|
return rev
|
||||||
|
|
||||||
|
|
||||||
|
print reverseBits("4567")
|
||||||
|
|
||||||
|
|
||||||
19
_code/bit manipulation/singleNumber3.py
Normal file
19
_code/bit manipulation/singleNumber3.py
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
|
||||||
|
nums = [1,2,1,3,2,5]
|
||||||
|
|
||||||
|
def singleNumber(nums):
|
||||||
|
|
||||||
|
xor = 0
|
||||||
|
for n in nums:
|
||||||
|
xor ^= n
|
||||||
|
|
||||||
|
# xor = num1 ^ num2
|
||||||
|
firstbit = xor & (xor-1) ^ xor
|
||||||
|
num1 = 0
|
||||||
|
for n in nums:
|
||||||
|
if n & firstbit:
|
||||||
|
num1 ^= n
|
||||||
|
|
||||||
|
return [num1, num1^xor]
|
||||||
|
|
||||||
|
print( singleNumber(nums) )
|
||||||
26
_code/bit manipulation/singleNumberii.py
Normal file
26
_code/bit manipulation/singleNumberii.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
nums = [2,2,3,2]
|
||||||
|
|
||||||
|
def singleNumber(nums):
|
||||||
|
single = 0
|
||||||
|
for i in range(32):
|
||||||
|
count = 0
|
||||||
|
for num in nums:
|
||||||
|
# if num & (1<<i) == (1<<i): count +=1
|
||||||
|
if num & (1<<i) == (1<<i): count += 1
|
||||||
|
|
||||||
|
single |= (count%3) << 1
|
||||||
|
|
||||||
|
return single if single < (1<<31) else sing
|
||||||
|
le - (1<<32)
|
||||||
|
|
||||||
|
# def singleNumber(nums):
|
||||||
|
# single = 0
|
||||||
|
# for i in range(32):
|
||||||
|
# count = 0
|
||||||
|
# for num in nums:
|
||||||
|
# if num & (1<<i) == (1<<i): count += 1
|
||||||
|
# single |= (count%3) << i
|
||||||
|
|
||||||
|
# return single if single < (1<<31) else single - (1<<32)
|
||||||
|
|
||||||
|
print(singleNumber(nums))
|
||||||
39
_code/dfs/binaryTreeZigZagDFS.py
Normal file
39
_code/dfs/binaryTreeZigZagDFS.py
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
class TreeNode:
|
||||||
|
|
||||||
|
def __init__(self, val):
|
||||||
|
|
||||||
|
self.val = val
|
||||||
|
self.left = None
|
||||||
|
self.right = None
|
||||||
|
|
||||||
|
def zigzagLevelOrder(root):
|
||||||
|
|
||||||
|
output = []
|
||||||
|
|
||||||
|
def dfs(node, level, output):
|
||||||
|
|
||||||
|
if not node:
|
||||||
|
return
|
||||||
|
|
||||||
|
if len(output) <= level:
|
||||||
|
output += [[]]
|
||||||
|
|
||||||
|
dfs(node.left, level+1, output)
|
||||||
|
dfs(node.right, level+1, output)
|
||||||
|
|
||||||
|
if level%2==0:
|
||||||
|
output[level].append(node.val)
|
||||||
|
else:
|
||||||
|
output[level].insert(0, node.val)
|
||||||
|
|
||||||
|
dfs(root, 0, output)
|
||||||
|
return output
|
||||||
|
|
||||||
|
|
||||||
|
root = TreeNode(3)
|
||||||
|
root.left = TreeNode(9)
|
||||||
|
root.right = TreeNode(20)
|
||||||
|
root.right.left = TreeNode(15)
|
||||||
|
root.right.right = TreeNode(7)
|
||||||
|
|
||||||
|
print( zigzagLevelOrder(root) )
|
||||||
36
_code/dynamic programming/coinChange1.py
Normal file
36
_code/dynamic programming/coinChange1.py
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
|
||||||
|
coins = [1,2,5]
|
||||||
|
amount = 11
|
||||||
|
|
||||||
|
|
||||||
|
def coinChange(coins, amount):
|
||||||
|
if not amount: return 0
|
||||||
|
min_coins = [0] + [float('inf')] * amount
|
||||||
|
|
||||||
|
for c in coins:
|
||||||
|
for i in range(c, amount + 1):
|
||||||
|
print(c, i, min_coins, min_coins[i], min_coins[i-c])
|
||||||
|
min_coins[i] = min(min_coins[i], min_coins[i - c] + 1) # current val is min of current val or current val - coin + 1
|
||||||
|
print(c, i, min_coins, min_coins[i], min_coins[i-c])
|
||||||
|
print()
|
||||||
|
|
||||||
|
return min_coins[-1] if min_coins[-1] != float('inf') else -1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def coinChange2(coins, amount):
|
||||||
|
|
||||||
|
dp = [0] + [float('inf')]*amount
|
||||||
|
|
||||||
|
for i in range(1, amount+1):
|
||||||
|
for c in coins:
|
||||||
|
dp[i] = min( dp[i], dp[i-c]+1)
|
||||||
|
|
||||||
|
|
||||||
|
print(dp)
|
||||||
|
return dp[-1] if dp[-1]!=float('inf') else -1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print(coinChange2(coins, amount))
|
||||||
20
_code/dynamic programming/coinChange2.py
Normal file
20
_code/dynamic programming/coinChange2.py
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
amount = 5
|
||||||
|
coins = [1,2,5]
|
||||||
|
|
||||||
|
def change(amount, coins):
|
||||||
|
|
||||||
|
|
||||||
|
dp = [[1]+[0]*amount for _ in range(len(coins)+1)]
|
||||||
|
for i in range(1, len(coins)+1):
|
||||||
|
for j in range(1, amount+1):
|
||||||
|
if coins[i-1] <= j:
|
||||||
|
dp[i][j] = dp[i-1][j] + dp[i][j-coins[i-1]]
|
||||||
|
else:
|
||||||
|
dp[i][j] = dp[i-1][j]
|
||||||
|
|
||||||
|
print(dp)
|
||||||
|
|
||||||
|
return dp[len(coins)][amount] # or dp[-1][-1]
|
||||||
|
|
||||||
|
|
||||||
|
print( change( amount, coins ) )
|
||||||
23
_code/dynamic programming/houseRobber.py
Normal file
23
_code/dynamic programming/houseRobber.py
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
nums = [1,2,3,1]
|
||||||
|
|
||||||
|
# [1,2,3,1]
|
||||||
|
# [1,2,4,4]
|
||||||
|
|
||||||
|
|
||||||
|
def rob(nums):
|
||||||
|
|
||||||
|
if not nums: return 0
|
||||||
|
|
||||||
|
dp = [1] * len(nums)
|
||||||
|
dp[0] = nums[0]
|
||||||
|
dp[1] = max(nums[0], nums[1])
|
||||||
|
|
||||||
|
for i in range(2, len(nums)):
|
||||||
|
# dp.append( max( nums[i] + dp[i-2], dp[i-1] ) )
|
||||||
|
dp[i] = max( nums[i] + dp[i-2], dp[i-1] )
|
||||||
|
|
||||||
|
print(dp)
|
||||||
|
|
||||||
|
return dp[-1]
|
||||||
|
|
||||||
|
print(rob(nums))
|
||||||
31
_code/dynamic programming/houseRobber2.py
Normal file
31
_code/dynamic programming/houseRobber2.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
nums = [1,2,3,1]
|
||||||
|
|
||||||
|
nums = [1]
|
||||||
|
|
||||||
|
def rob(nums):
|
||||||
|
|
||||||
|
# handle edge cases
|
||||||
|
if not nums: return 0
|
||||||
|
if len(nums)==1: return nums[0]
|
||||||
|
if len(nums)==2: return max(nums[0], nums[1])
|
||||||
|
|
||||||
|
def robHelper(nums):
|
||||||
|
|
||||||
|
dp = [1] * len(nums)
|
||||||
|
dp[0] = nums[0]
|
||||||
|
dp[1] = max(nums[0], nums[1])
|
||||||
|
|
||||||
|
for i in range(2, len(nums)):
|
||||||
|
dp[i] = max( nums[i] + dp[i-2], dp[i-1] )
|
||||||
|
|
||||||
|
print(dp)
|
||||||
|
|
||||||
|
return dp[-1]
|
||||||
|
|
||||||
|
excludeFirst = nums[1:]
|
||||||
|
excludeLast = nums[:-1]
|
||||||
|
|
||||||
|
return max( robHelper(excludeFirst), robHelper(excludeLast) )
|
||||||
|
|
||||||
|
|
||||||
|
print(rob(nums))
|
||||||
31
_code/dynamic programming/longestCommonSubsequence.py
Normal file
31
_code/dynamic programming/longestCommonSubsequence.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
str1 = "AABA"
|
||||||
|
str2 = "AZB"
|
||||||
|
|
||||||
|
def lcs(text1, text2):
|
||||||
|
|
||||||
|
n= len(text1)
|
||||||
|
m= len(text2)
|
||||||
|
|
||||||
|
# creates an [m+1][n+1] matrix, filled with zeros
|
||||||
|
table=[[0]*(n+1) for _ in range(m+1)]
|
||||||
|
|
||||||
|
for i in range(1, m+1):
|
||||||
|
for j in range (1, n+1):
|
||||||
|
|
||||||
|
# first char is the same, so add 1 to count
|
||||||
|
if text2[i-1]==text1[j-1]:
|
||||||
|
table[i][j]= 1+table[i-1][j-1]
|
||||||
|
# first char is different, so break into subproblems and take the max
|
||||||
|
else:
|
||||||
|
table[i][j]=max(table[i-1][j],table[i][j-1])
|
||||||
|
|
||||||
|
|
||||||
|
print( [0]*(n+1) )
|
||||||
|
print( range(m+1) )
|
||||||
|
print( table )
|
||||||
|
print( max(table) ) # this get the last element at the end of the list
|
||||||
|
return max(max(table)) # this gets the last element at the bottom right corner (last element of both lists)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print( lcs(str1, str2))
|
||||||
63
_code/dynamic programming/perfectSquares/notes
Normal file
63
_code/dynamic programming/perfectSquares/notes
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
12
|
||||||
|
|
||||||
|
1 4 9
|
||||||
|
|
||||||
|
|
||||||
|
build perfect squares up to n
|
||||||
|
12-9=3
|
||||||
|
3-1=2
|
||||||
|
2-1=1
|
||||||
|
|
||||||
|
12=9+1+1+1 -> 4
|
||||||
|
12=4+4+4 -> 3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1 -> 1 (1)
|
||||||
|
2 -> 2 (1+1)
|
||||||
|
3 -> 3 (1+1+1)
|
||||||
|
4 -> 1 (4)
|
||||||
|
5 -> 2 (4+1)
|
||||||
|
6 -> 3 (4+1+1)
|
||||||
|
7 -> 4 4+1+1+1
|
||||||
|
8 -> 2 4+4
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
f(1) = 1
|
||||||
|
f(2) = f(1) + f(1) = 1+1=2
|
||||||
|
|
||||||
|
f(7) = f(4) + f(3) = 1+3=4
|
||||||
|
f(8) = f(4) + f(4) = 1+1=2
|
||||||
|
f(12) = f(8) + f(4) = 2+1=3
|
||||||
|
|
||||||
|
identify subproblems?
|
||||||
|
|
||||||
|
https://leetcode.com/problems/perfect-squares/discuss/696436/Python-Simple-DP-Solution
|
||||||
|
|
||||||
|
n=7
|
||||||
|
square_sums = [0,1,4]
|
||||||
|
dp = [0, inf, inf, inf, inf, inf, inf, inf]
|
||||||
|
|
||||||
|
0 1 2 3 4 5 6 7
|
||||||
|
dp = [0, 1, 2, 3, 1, 2, 3, 4]
|
||||||
|
|
||||||
|
dp = [0, 1, inf, inf, 1, inf, inf, inf]
|
||||||
|
|
||||||
|
i: 1->n
|
||||||
|
iter all squares
|
||||||
|
min( dp[i], dp[i-square] )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
f(1)=1
|
||||||
|
f(2)=2
|
||||||
|
f(12)=
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
these are the candidates
|
||||||
|
|
||||||
13
_code/dynamic programming/perfectSquares/perfectSquares.py
Normal file
13
_code/dynamic programming/perfectSquares/perfectSquares.py
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import math
|
||||||
|
|
||||||
|
n = 7
|
||||||
|
|
||||||
|
def numSquares(n):
|
||||||
|
|
||||||
|
squares = [i**2 for i in range(0, int(math.sqrt(n))+1) ]
|
||||||
|
dp = [float(inf)] * n
|
||||||
|
|
||||||
|
print(squares)
|
||||||
|
print(dp)
|
||||||
|
|
||||||
|
print( numSquares(n) )
|
||||||
33
_code/graphs/cheapestFlight/cheapestFlightsWithinKStops.py
Normal file
33
_code/graphs/cheapestFlight/cheapestFlightsWithinKStops.py
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
import collections
|
||||||
|
|
||||||
|
n = 3
|
||||||
|
edges = [[0,1,100],[1,2,200],[0,2,500]]
|
||||||
|
src = 0
|
||||||
|
dst = 2
|
||||||
|
k = 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def findCheapestPrice(n, flights, src, dst, K):
|
||||||
|
|
||||||
|
if src == dst: return 0
|
||||||
|
|
||||||
|
d, seen = collections.defaultdict(list), collections.defaultdict(lambda: float('inf'))
|
||||||
|
for u, v, p in flights:
|
||||||
|
d[u] += [(v, p)]
|
||||||
|
|
||||||
|
q = [(src, -1, 0)]
|
||||||
|
|
||||||
|
while q:
|
||||||
|
pos, k, cost = q.pop(0)
|
||||||
|
if pos == dst or k == K: continue
|
||||||
|
for nei, p in d[pos]:
|
||||||
|
if cost + p >= seen[nei]:
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
seen[nei] = cost+p
|
||||||
|
q += [(nei, k+1, cost+p)]
|
||||||
|
|
||||||
|
return seen[dst] if seen[dst] < float('inf') else -1
|
||||||
|
|
||||||
|
print( findCheapestPrice(n, edges, src, dst, k) )
|
||||||
@ -0,0 +1,52 @@
|
|||||||
|
from collections import deque
|
||||||
|
|
||||||
|
'''
|
||||||
|
https://www.youtube.com/watch?v=Jbb9qNIAyg0
|
||||||
|
'''
|
||||||
|
import collections
|
||||||
|
|
||||||
|
n = 3
|
||||||
|
flights = [[0,1,100],[1,2,200],[0,2,500]]
|
||||||
|
src = 0
|
||||||
|
dest = 2
|
||||||
|
k = 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def findCheapestPrice(n, flights, src, dest, K):
|
||||||
|
|
||||||
|
# d = collections.defaultdict(list)
|
||||||
|
# seen = collections.defaultdict(lambda: float('inf'))
|
||||||
|
|
||||||
|
adj = [[] for _ in range(n)]
|
||||||
|
output = [float('inf') for _ in range(n)]
|
||||||
|
output[src] = 0
|
||||||
|
|
||||||
|
# add to adj list where key is src, and value is destination+cost
|
||||||
|
for u, v, w in flights:
|
||||||
|
adj[u] += [(v, w)]
|
||||||
|
|
||||||
|
|
||||||
|
graph = deque()
|
||||||
|
graph.append((src, -1)) # where -1 is the number of stops
|
||||||
|
|
||||||
|
while graph:
|
||||||
|
|
||||||
|
u, stop = graph.popleft()
|
||||||
|
if stop >= K:
|
||||||
|
continue
|
||||||
|
|
||||||
|
for v, w in adj[u]:
|
||||||
|
|
||||||
|
output[v] = output[u]+w
|
||||||
|
graph.append((v,stop+1))
|
||||||
|
|
||||||
|
if output[dest] == float('inf'):
|
||||||
|
return -1
|
||||||
|
else:
|
||||||
|
return output[dest]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print( findCheapestPrice(n, flights, src, dest, k) )
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
import heapq
|
||||||
|
from collections import deque
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
|
'''
|
||||||
|
https://www.youtube.com/watch?v=Jbb9qNIAyg0
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
n = 3
|
||||||
|
flights = [[0,1,100],[1,2,200],[0,2,500]]
|
||||||
|
src = 0
|
||||||
|
dest = 2
|
||||||
|
k = 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def findCheapestPrice(n, flights, src, dest, K):
|
||||||
|
|
||||||
|
output = [float("inf")] * n
|
||||||
|
output[src] = 0
|
||||||
|
|
||||||
|
graph = defaultdict(list)
|
||||||
|
heap = [(src, -1)] # dest, costs
|
||||||
|
|
||||||
|
# add to adj hash table
|
||||||
|
for u, v, w in flights:
|
||||||
|
graph[u].append((v,w))
|
||||||
|
|
||||||
|
while heap:
|
||||||
|
|
||||||
|
v, w = heapq.heappop(heap)
|
||||||
|
|
||||||
|
for v, w in graph[v]:
|
||||||
|
output[v] = output[u]+w
|
||||||
|
heapq.heappush(heap, (v, output[u]+w))
|
||||||
|
|
||||||
|
print( output )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print( findCheapestPrice(n, flights, src, dest, k) )
|
||||||
25
_code/graphs/grokking-algo-book/grokking-algo-book-bfs.py
Normal file
25
_code/graphs/grokking-algo-book/grokking-algo-book-bfs.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
from collections import deque
|
||||||
|
|
||||||
|
# graph as adjacency lists (dictionary of lists)
|
||||||
|
graph = {}
|
||||||
|
graph["you"] = ["alice", "bob", "claire"]
|
||||||
|
graph["bob"] = ["anuj", "peggy"]
|
||||||
|
graph["alice"] = ["peggy"]
|
||||||
|
graph["claire"] = ["thom", "jonny"]
|
||||||
|
graph["anuj"] = []
|
||||||
|
graph["peggy"] = []
|
||||||
|
graph["thom"] = []
|
||||||
|
graph["jonny"] = []
|
||||||
|
|
||||||
|
|
||||||
|
print(graph)
|
||||||
|
|
||||||
|
|
||||||
|
# create queue
|
||||||
|
search_queue = deque()
|
||||||
|
search_queue += graph["you"]
|
||||||
|
|
||||||
|
while search_queue:
|
||||||
|
|
||||||
|
person = search_queue.popleft()
|
||||||
|
if p
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# dijkstra needs 3 hashtables and a list to keep track of processed nodes
|
||||||
|
graph = {}
|
||||||
|
costs = {}
|
||||||
|
parents = {}
|
||||||
|
|
||||||
|
processed = []
|
||||||
|
|
||||||
|
# graph: a hashtable of more hash tables to store edges and weights
|
||||||
|
graph["start"] = {}
|
||||||
|
graph["start"]["a"] = 6
|
||||||
|
graph["start"]["b"] = 2
|
||||||
|
|
||||||
|
graph["a"] = {}
|
||||||
|
graph["a"]["fin"] = 1
|
||||||
|
|
||||||
|
graph["b"] = {}
|
||||||
|
graph["b"]["a"] = 3
|
||||||
|
graph["b"]["fin"] = 5
|
||||||
|
|
||||||
|
graph["fin"] = {}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# costs: a hashtable to store costs of each node
|
||||||
|
infinity = float("inf")
|
||||||
|
costs["a"] = 6
|
||||||
|
costs["b"] = 2
|
||||||
|
costs["fin"] = infinity
|
||||||
|
|
||||||
|
|
||||||
|
# parents hashtable
|
||||||
|
parents["a"] = "start"
|
||||||
|
parents["b"] = "start"
|
||||||
|
parents["fin"] = None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print( graph )
|
||||||
|
print( costs )
|
||||||
|
print( parents )
|
||||||
37
_code/graphs/network-delay/network-delay-dijkstra.py
Normal file
37
_code/graphs/network-delay/network-delay-dijkstra.py
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
import heapq
|
||||||
|
from collections import deque
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
|
times = [[2,1,1],[2,3,1],[3,4,1]]
|
||||||
|
N = 4
|
||||||
|
K = 2
|
||||||
|
|
||||||
|
def networkDelayTime(times, N, K):
|
||||||
|
|
||||||
|
elapsedTime = [0] + [float("inf")] * N
|
||||||
|
graph = defaultdict(list)
|
||||||
|
heap = [(0, K)]
|
||||||
|
|
||||||
|
# add to adj hash table, where group
|
||||||
|
for u, v, w in times:
|
||||||
|
graph[u].append((v, w))
|
||||||
|
|
||||||
|
|
||||||
|
while heap:
|
||||||
|
|
||||||
|
# pop off heap/queue
|
||||||
|
time, node = heapq.heappop(heap)
|
||||||
|
if time < elapsedTime[node]:
|
||||||
|
|
||||||
|
# process (add to elapsed time array)
|
||||||
|
elapsedTime[node] = time
|
||||||
|
|
||||||
|
# add neighbours, include weight
|
||||||
|
for v, w in graph[node]:
|
||||||
|
heapq.heappush(heap, (time + w, v))
|
||||||
|
|
||||||
|
|
||||||
|
mx = max(elapsedTime)
|
||||||
|
return mx if mx < float("inf") else -1
|
||||||
|
|
||||||
|
print( networkDelayTime(times, N, K) )
|
||||||
23
_code/graphs/reconstructIternatry/reconstructIternary.py
Normal file
23
_code/graphs/reconstructIternatry/reconstructIternary.py
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# tickets = [["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]]
|
||||||
|
tickets = [["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
|
||||||
|
|
||||||
|
def findTicketIndForStartCity(startCity):
|
||||||
|
|
||||||
|
for ticketInd, cities in enumerate(tickets):
|
||||||
|
if cities[0]==startCity:
|
||||||
|
return ticketInd
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
tickets.sort(key=lambda x: x[1])
|
||||||
|
|
||||||
|
|
||||||
|
output = ['JFK']
|
||||||
|
for i in range(0, len(tickets)):
|
||||||
|
|
||||||
|
currTicketIndex = findTicketIndForStartCity( output[-1] )
|
||||||
|
nextCity = tickets[currTicketIndex][1]
|
||||||
|
output.append(nextCity)
|
||||||
|
|
||||||
|
print(output)
|
||||||
30
_code/graphs/reconstructIternatry/reconstructIternaryDfs.py
Normal file
30
_code/graphs/reconstructIternatry/reconstructIternaryDfs.py
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
tickets = [["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]]
|
||||||
|
# tickets = [["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
|
||||||
|
|
||||||
|
def findTicketIndForStartCity(startCity):
|
||||||
|
|
||||||
|
graph = {}
|
||||||
|
|
||||||
|
tickets.sort(key=lambda x: x[1])
|
||||||
|
|
||||||
|
# add all to graph hashmap
|
||||||
|
for u, v in tickets:
|
||||||
|
if u in graph:
|
||||||
|
graph[u].append(v)
|
||||||
|
else:
|
||||||
|
graph[u] = [v]
|
||||||
|
|
||||||
|
# put jfk on stack
|
||||||
|
itinerary, stack = [], [("JFK")]
|
||||||
|
|
||||||
|
while stack:
|
||||||
|
curr = stack[-1]
|
||||||
|
|
||||||
|
if curr in graph and len(graph[curr]) > 0:
|
||||||
|
stack.append(graph[curr].pop(0))
|
||||||
|
else:
|
||||||
|
itinerary.append(stack.pop())
|
||||||
|
return itinerary[::-1]
|
||||||
|
|
||||||
|
|
||||||
|
print( findTicketIndForStartCity(tickets) )
|
||||||
15
_code/greedy/jumpGame.py
Normal file
15
_code/greedy/jumpGame.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
arr = [2,3,1,1,4]
|
||||||
|
|
||||||
|
def canJump(nums) -> bool:
|
||||||
|
|
||||||
|
lastGoodPos = len(nums) - 1
|
||||||
|
for i in reversed(range(len(nums))):
|
||||||
|
|
||||||
|
print(i, nums[i], lastGoodPos, i + nums[i] >= lastGoodPos)
|
||||||
|
|
||||||
|
if i + nums[i] >= lastGoodPos:
|
||||||
|
lastGoodPos = i
|
||||||
|
|
||||||
|
return lastGoodPos == 0
|
||||||
|
|
||||||
|
canJump(arr)
|
||||||
22
_code/greedy/queueReconstructionByHeight.py
Normal file
22
_code/greedy/queueReconstructionByHeight.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
people = [[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
|
||||||
|
# turn to [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
|
||||||
|
|
||||||
|
def reconstructQueue(people):
|
||||||
|
|
||||||
|
print(people)
|
||||||
|
|
||||||
|
# sort ppl by decending height first and k second
|
||||||
|
people.sort(key=lambda x: (-x[0], x[1]))
|
||||||
|
|
||||||
|
print(people)
|
||||||
|
|
||||||
|
ans = []
|
||||||
|
for person, num in people:
|
||||||
|
|
||||||
|
if num >= len(ans):
|
||||||
|
ans.append([person, num])
|
||||||
|
else:
|
||||||
|
ans.insert(num, [person, num])
|
||||||
|
return ans
|
||||||
|
|
||||||
|
print( reconstructQueue(people) )
|
||||||
20
_code/hashing/isomorphicStrings.py
Normal file
20
_code/hashing/isomorphicStrings.py
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
|
||||||
|
|
||||||
|
def normalize(word):
|
||||||
|
|
||||||
|
# map[char] -> [mapped integer]
|
||||||
|
myMap = {}
|
||||||
|
count=0
|
||||||
|
normalized=""
|
||||||
|
for c in word:
|
||||||
|
if c not in myMap:
|
||||||
|
myMap[c] = count
|
||||||
|
count+=1
|
||||||
|
normalized += str(myMap[c])
|
||||||
|
else:
|
||||||
|
normalized += str(myMap[c])
|
||||||
|
|
||||||
|
return normalized
|
||||||
|
|
||||||
|
|
||||||
|
print( normalize("aa") )
|
||||||
21
_code/hashing/longestWord.py
Normal file
21
_code/hashing/longestWord.py
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import re
|
||||||
|
|
||||||
|
def LongestWord(sen):
|
||||||
|
|
||||||
|
# code goes here
|
||||||
|
tokens = sen.split(" ")
|
||||||
|
|
||||||
|
maxWord = ""
|
||||||
|
maxLength = 0
|
||||||
|
for token in tokens:
|
||||||
|
|
||||||
|
token = re.sub('[^a-zA-Z]','', token)
|
||||||
|
|
||||||
|
if len(token) > maxLength:
|
||||||
|
maxLength = len(token)
|
||||||
|
maxWord = token
|
||||||
|
|
||||||
|
return maxWord
|
||||||
|
|
||||||
|
# keep this function call here
|
||||||
|
print(LongestWord(input()))
|
||||||
14
_code/heap/heaptest.py
Normal file
14
_code/heap/heaptest.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import heapq
|
||||||
|
|
||||||
|
li = [5, 7, 9, 1, 3]
|
||||||
|
|
||||||
|
heapq.heapify(li)
|
||||||
|
|
||||||
|
# printing created heap
|
||||||
|
print ("The created heap is : ",end="")
|
||||||
|
print (list(li))
|
||||||
|
|
||||||
|
heapq.heappush(li,4)
|
||||||
|
|
||||||
|
print ("The modified heap after push is : ",end="")
|
||||||
|
print (list(li))
|
||||||
29
_code/heap/lastStoneWeight.py
Normal file
29
_code/heap/lastStoneWeight.py
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import heapq
|
||||||
|
|
||||||
|
stones = [2,7,4,1,8,1]
|
||||||
|
|
||||||
|
def lastStoneWeight(stones):
|
||||||
|
|
||||||
|
while len(stones)>=2:
|
||||||
|
|
||||||
|
# negate values for max heap
|
||||||
|
stones = list(map(lambda x: -x if x>0 else x, stones))
|
||||||
|
# stones = [-x for x in stones if x>0 else x]
|
||||||
|
print(stones)
|
||||||
|
|
||||||
|
# get top 2 heaviest stones
|
||||||
|
heapq.heapify(stones)
|
||||||
|
print(stones)
|
||||||
|
heavy1 = heapq.heappop(stones)
|
||||||
|
heavy2 = heapq.heappop(stones)
|
||||||
|
|
||||||
|
# smash the heaviest stones
|
||||||
|
diff = abs(heavy1-heavy2)
|
||||||
|
heapq.heappush(stones, diff)
|
||||||
|
print(stones)
|
||||||
|
|
||||||
|
print(stones)
|
||||||
|
return stones[0]
|
||||||
|
|
||||||
|
|
||||||
|
print(lastStoneWeight(stones))
|
||||||
66
_code/heap/topKfrequentElements.py
Normal file
66
_code/heap/topKfrequentElements.py
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
'''
|
||||||
|
https://leetcode.com/problems/top-k-frequent-elements/solution/
|
||||||
|
https://hg.python.org/cpython/file/2.7/Lib/heapq.py#l16
|
||||||
|
https://www.youtube.com/watch?v=Gj4-8sRi7W0
|
||||||
|
'''
|
||||||
|
|
||||||
|
from collections import Counter
|
||||||
|
import heapq
|
||||||
|
|
||||||
|
nums = [1,1,1,2,2,3]
|
||||||
|
|
||||||
|
def topKFrequent1(nums, k):
|
||||||
|
|
||||||
|
count = Counter(nums)
|
||||||
|
|
||||||
|
return heapq.nlargest(k, count.keys(), key=count.get)
|
||||||
|
|
||||||
|
|
||||||
|
def topKFrequent2(nums, k):
|
||||||
|
|
||||||
|
c = Counter(nums) # {1: 3, 2: 2, 3: 1}
|
||||||
|
|
||||||
|
|
||||||
|
c = [(-v,k) for k,v in c.items()] # (v,k) [(3, 1), (2, 2), (1, 3)]
|
||||||
|
# (-v,k) [(-3, 1), (-2, 2), (-1, 3)]
|
||||||
|
|
||||||
|
heapq.heapify(c)
|
||||||
|
|
||||||
|
output = []
|
||||||
|
for i in range(k):
|
||||||
|
item = heapq.heappop(c)
|
||||||
|
output.append(item[1])
|
||||||
|
|
||||||
|
return output
|
||||||
|
|
||||||
|
|
||||||
|
print(topKFrequent2(nums, 2))
|
||||||
|
|
||||||
|
|
||||||
|
____________
|
||||||
|
|
||||||
|
|
||||||
|
{% highlight python %}
|
||||||
|
|
||||||
|
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
|
||||||
|
|
||||||
|
minHeap=[]
|
||||||
|
c = Counter(nums)
|
||||||
|
|
||||||
|
for n in c.values():
|
||||||
|
|
||||||
|
heapq.heappush(minHeap, n)
|
||||||
|
|
||||||
|
if len(minHeap)>k:
|
||||||
|
heapq.heappop(minHeap)
|
||||||
|
|
||||||
|
|
||||||
|
out = []
|
||||||
|
for k,v in c.items():
|
||||||
|
if v in minHeap:
|
||||||
|
out.append(k)
|
||||||
|
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
{% endhighlight %}
|
||||||
126
_code/implementation/lruCache.py
Normal file
126
_code/implementation/lruCache.py
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
|
||||||
|
class DLLNode:
|
||||||
|
|
||||||
|
def __init__(self, key, val):
|
||||||
|
|
||||||
|
self.key = key
|
||||||
|
self.val = val
|
||||||
|
self.next = None
|
||||||
|
self.prev = None
|
||||||
|
|
||||||
|
class LruCache:
|
||||||
|
|
||||||
|
def __init__(self, capacity):
|
||||||
|
|
||||||
|
# hashtable for fast lookup
|
||||||
|
self.hashmap = {}
|
||||||
|
self.capacity = capacity
|
||||||
|
|
||||||
|
self.head = None # most recently used item
|
||||||
|
self.tail = None # least recently used item
|
||||||
|
|
||||||
|
|
||||||
|
def get(self, key):
|
||||||
|
|
||||||
|
## TODO
|
||||||
|
|
||||||
|
return hashmap.get(key)
|
||||||
|
|
||||||
|
'''
|
||||||
|
put will need to put elements into
|
||||||
|
'''
|
||||||
|
def put(self, key, val):
|
||||||
|
|
||||||
|
# if capacity is reached, evict last elem
|
||||||
|
# if len(self.hashmap)==self.capacity:
|
||||||
|
|
||||||
|
# print "capacity reached"
|
||||||
|
# lastNode = self.tail
|
||||||
|
# self.tail = lastNode.prev
|
||||||
|
# lastNode.prev = None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# key exists in hash table
|
||||||
|
if key in self.hashmap:
|
||||||
|
|
||||||
|
# update node's value
|
||||||
|
currentNode = self.hashmap[key]
|
||||||
|
currentNode.val = val
|
||||||
|
|
||||||
|
# if current node is not head
|
||||||
|
if not currentNode == self.head:
|
||||||
|
|
||||||
|
# remove yourself from list
|
||||||
|
if currentNode.prev:
|
||||||
|
currentNode.prev.next = currentNode.next
|
||||||
|
if currentNode.next:
|
||||||
|
currentNode.next.prev = currentNode.prev
|
||||||
|
|
||||||
|
# add to beginning of list
|
||||||
|
currentNode.next = self.head
|
||||||
|
self.head = currentNode # reassign head node
|
||||||
|
|
||||||
|
# if current node is tail node
|
||||||
|
if currentNode == self.tail:
|
||||||
|
self.tail = currentNode.prev
|
||||||
|
currentNode.prev = None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# not in hash table
|
||||||
|
else:
|
||||||
|
|
||||||
|
# put it at the front of the list
|
||||||
|
newNode = DLLNode(key, val)
|
||||||
|
|
||||||
|
if not self.head:
|
||||||
|
self.head = newNode
|
||||||
|
self.tail = newNode
|
||||||
|
else:
|
||||||
|
newNode.next = self.head
|
||||||
|
self.head.prev = newNode
|
||||||
|
self.head = newNode # reassign head node
|
||||||
|
|
||||||
|
|
||||||
|
# add node to hash table
|
||||||
|
self.hashmap[key] = newNode
|
||||||
|
|
||||||
|
def show(self):
|
||||||
|
|
||||||
|
# print hashmap
|
||||||
|
print( self.hashmap )
|
||||||
|
print ("head: " + str(self.head.val))
|
||||||
|
print ("tail: " + str(self.tail.val))
|
||||||
|
|
||||||
|
# iterate doubly linked list
|
||||||
|
node = self.head
|
||||||
|
while node:
|
||||||
|
print( node.val )
|
||||||
|
node = node.next
|
||||||
|
|
||||||
|
print("")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cache = LruCache(3)
|
||||||
|
cache.put(1,10)
|
||||||
|
cache.put(2,20)
|
||||||
|
cache.put(3,30)
|
||||||
|
cache.show()
|
||||||
|
|
||||||
|
|
||||||
|
cache.put(2, 200) # move elem to head
|
||||||
|
cache.show()
|
||||||
|
|
||||||
|
cache.put(1, 100) # move end elem to beginning
|
||||||
|
cache.show()
|
||||||
|
|
||||||
|
cache.put(1, 1000) # move start elem to beginning (breaks)
|
||||||
|
cache.show()
|
||||||
|
|
||||||
|
cache.put(4, 40)
|
||||||
|
cache.show() # test new eviction logic
|
||||||
54
_code/implementation/minStack.py
Normal file
54
_code/implementation/minStack.py
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
|
||||||
|
class MinStack:
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
|
||||||
|
self.s1 = []
|
||||||
|
self.s2 = []
|
||||||
|
|
||||||
|
|
||||||
|
def push(self, num):
|
||||||
|
|
||||||
|
self.s1.append( num )
|
||||||
|
|
||||||
|
if len(self.s2)==0 or num < self.s2[-1]:
|
||||||
|
self.s2.append( num )
|
||||||
|
else:
|
||||||
|
self.s2.append( self.s2[-1] )
|
||||||
|
|
||||||
|
|
||||||
|
def pop(self):
|
||||||
|
|
||||||
|
self.s2.pop()
|
||||||
|
|
||||||
|
return self.s1.pop()
|
||||||
|
|
||||||
|
|
||||||
|
def show(self):
|
||||||
|
|
||||||
|
print(self.s1)
|
||||||
|
print(self.s2)
|
||||||
|
print("Min: ", self.s2[-1] )
|
||||||
|
print('')
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
minStack = MinStack()
|
||||||
|
|
||||||
|
minStack.push(3)
|
||||||
|
minStack.show()
|
||||||
|
|
||||||
|
minStack.push(1)
|
||||||
|
minStack.show()
|
||||||
|
|
||||||
|
minStack.push(2)
|
||||||
|
minStack.show()
|
||||||
|
|
||||||
|
minStack.pop()
|
||||||
|
minStack.show()
|
||||||
|
|
||||||
|
minStack.pop()
|
||||||
|
minStack.show()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
40
_code/interval/mergeInterval.py
Normal file
40
_code/interval/mergeInterval.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
'''
|
||||||
|
LL56: Merge Sorted Intervals
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
# nonSorted = [[2,6],[8,10],[15,18],[1,30]]
|
||||||
|
# nonSorted.sort(key=lambda x: x[0])
|
||||||
|
# print(nonSorted) # [[1, 3], [2, 6], [8, 10], [15, 18]]
|
||||||
|
|
||||||
|
|
||||||
|
intervals = [[1,3],[2,6],[8,10],[15,18]]
|
||||||
|
|
||||||
|
|
||||||
|
def merge(intervals):
|
||||||
|
|
||||||
|
intervals.sort(key=lambda x: x[0])
|
||||||
|
|
||||||
|
merged = []
|
||||||
|
|
||||||
|
# add the first interval to merged[]
|
||||||
|
merged.append(intervals[0])
|
||||||
|
|
||||||
|
for interval in intervals:
|
||||||
|
|
||||||
|
print(interval)
|
||||||
|
|
||||||
|
if merged[-1][1] < interval[0]: # no merge, [2,6] compared to [8,10]
|
||||||
|
|
||||||
|
print('no merge')
|
||||||
|
merged.append(interval)
|
||||||
|
else:
|
||||||
|
print('merge', merged[-1][1], interval[1])
|
||||||
|
merged[-1][1] = max(merged[-1][1], interval[1] ) # choose the max of "prev" (aka: merged[-1]) or the current interval
|
||||||
|
|
||||||
|
print()
|
||||||
|
|
||||||
|
print(merged)
|
||||||
|
|
||||||
|
|
||||||
|
merge(intervals)
|
||||||
6
_code/interviews/hackerrank.py
Normal file
6
_code/interviews/hackerrank.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
def foo(n):
|
||||||
|
for x in range(n):
|
||||||
|
yield x**3
|
||||||
|
|
||||||
|
for x in foo(5):
|
||||||
|
print (x),
|
||||||
8
_code/interviews/ikm_assessment_python3.py
Normal file
8
_code/interviews/ikm_assessment_python3.py
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
num=[1,2,3,4]
|
||||||
|
result=[]
|
||||||
|
|
||||||
|
|
||||||
|
for x in num:
|
||||||
|
result.append(x**2)
|
||||||
|
|
||||||
|
print(result)
|
||||||
@ -0,0 +1,66 @@
|
|||||||
|
# Given a singly linked list L: L0→L1→…→Ln-1→Ln,
|
||||||
|
# reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
|
||||||
|
|
||||||
|
# You may not modify the values in the list's nodes, only nodes itself may be changed.
|
||||||
|
|
||||||
|
# Example 1:
|
||||||
|
|
||||||
|
# Given 1->2->3->4, reorder it to 1->4->2->3.
|
||||||
|
# Example 2:
|
||||||
|
|
||||||
|
# Given 1->2->3->4->5, reorder it to 1->5->2->4->3.
|
||||||
|
|
||||||
|
from collections import deque
|
||||||
|
|
||||||
|
class LinkedListNode:
|
||||||
|
|
||||||
|
def __init__(self, val):
|
||||||
|
|
||||||
|
self.val = val
|
||||||
|
self.next = None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def reorderList(head):
|
||||||
|
|
||||||
|
# push all into list
|
||||||
|
q = deque()
|
||||||
|
while head:
|
||||||
|
q.append(head)
|
||||||
|
head = head.next
|
||||||
|
|
||||||
|
|
||||||
|
dummy = LinkedListNode(0)
|
||||||
|
cur = dummy
|
||||||
|
even = False
|
||||||
|
|
||||||
|
while q:
|
||||||
|
|
||||||
|
node = q.pop() if even else q.popleft()
|
||||||
|
node.next = None
|
||||||
|
|
||||||
|
cur.next = node
|
||||||
|
cur = cur.next
|
||||||
|
|
||||||
|
even ^= True
|
||||||
|
|
||||||
|
return dummy.next
|
||||||
|
|
||||||
|
|
||||||
|
# create sample linked list
|
||||||
|
head = LinkedListNode(1)
|
||||||
|
head.next = LinkedListNode(2)
|
||||||
|
head.next.next = LinkedListNode(3)
|
||||||
|
head.next.next.next = LinkedListNode(4)
|
||||||
|
head.next.next.next.next = LinkedListNode(5)
|
||||||
|
|
||||||
|
# run the code
|
||||||
|
head = reorderList(head)
|
||||||
|
|
||||||
|
|
||||||
|
while head:
|
||||||
|
print(head.val, end=" ")
|
||||||
|
head=head.next
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
11
_code/interviews/missingAndDuplicate.py
Normal file
11
_code/interviews/missingAndDuplicate.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
a = [6, 5, 4, 2, 6]
|
||||||
|
|
||||||
|
# 1 . continuous integers randomly sorted
|
||||||
|
# 2. min, max
|
||||||
|
# 3. missing -> 3
|
||||||
|
# 4. duplicate -> 6
|
||||||
|
|
||||||
|
|
||||||
|
Q: are we given min and max?
|
||||||
|
|
||||||
|
for i
|
||||||
7
_code/interviews/pramp/helper.py
Normal file
7
_code/interviews/pramp/helper.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
def helper(listt):
|
||||||
|
prod = 1
|
||||||
|
for val in listt:
|
||||||
|
prod = prod*val
|
||||||
|
return prod
|
||||||
|
|
||||||
|
print(helper([1,2,3]))
|
||||||
29
_code/interviews/pramp/minAddToMakeParenthesisValid.py
Normal file
29
_code/interviews/pramp/minAddToMakeParenthesisValid.py
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
numInvalid=0
|
||||||
|
stack=[]
|
||||||
|
|
||||||
|
for c in text:
|
||||||
|
if c=='(':
|
||||||
|
stack.append(c)
|
||||||
|
numInvalid+=1
|
||||||
|
|
||||||
|
elif c==')':
|
||||||
|
if not stack:
|
||||||
|
numInvalid+=1
|
||||||
|
else:
|
||||||
|
stack.pop()
|
||||||
|
numInvalid-=1
|
||||||
|
|
||||||
|
return numInvalid + len(stack)
|
||||||
|
|
||||||
|
|
||||||
|
res = 0
|
||||||
|
stack = 0
|
||||||
|
for bracket in text:
|
||||||
|
if bracket == '(':
|
||||||
|
stack += 1
|
||||||
|
if bracket == ')' and stack != 0:
|
||||||
|
stack -= 1
|
||||||
|
elif bracket == ')' and stack == 0:
|
||||||
|
res += 1
|
||||||
|
return res + stack
|
||||||
|
|
||||||
36
_code/interviews/pramp/prodOfArray.py
Normal file
36
_code/interviews/pramp/prodOfArray.py
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
arr = [8,10,2]
|
||||||
|
# arr = [2,2]
|
||||||
|
|
||||||
|
def array_of_array_products(arr):
|
||||||
|
#[8, 10, 2]
|
||||||
|
# i = 0. left = [], right [10,2]
|
||||||
|
res = []
|
||||||
|
def helper(listt):
|
||||||
|
prod = 1
|
||||||
|
for val in listt:
|
||||||
|
prod = prod*val
|
||||||
|
return prod
|
||||||
|
|
||||||
|
print(arr)
|
||||||
|
print(helper(arr))
|
||||||
|
|
||||||
|
# for i, val in enumerate(arr):
|
||||||
|
# left = None
|
||||||
|
# right = None
|
||||||
|
# if i != 0:
|
||||||
|
# left = helper(arr[:i])
|
||||||
|
# if i != len(arr)-1:
|
||||||
|
# right = helper(arr[i+1:])
|
||||||
|
# if left and right:
|
||||||
|
# res.append(left*right)
|
||||||
|
# elif left:
|
||||||
|
# res.append(left)
|
||||||
|
# elif right:
|
||||||
|
# res.append(right)
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print( array_of_array_products(arr) )
|
||||||
3
_code/interviews/regexTest.py
Normal file
3
_code/interviews/regexTest.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
import re
|
||||||
|
|
||||||
|
print( re.search("[aeiou]", "test") )
|
||||||
68
_code/interviews/softmaxdata.py
Normal file
68
_code/interviews/softmaxdata.py
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
a = [6, 5, 4, 2, 6]
|
||||||
|
|
||||||
|
# 1 . continuous integers randomly sorted
|
||||||
|
# 2. min, max
|
||||||
|
# 3. missing -> 3
|
||||||
|
# 4. duplicate -> 6
|
||||||
|
|
||||||
|
# similar to this hard LC question
|
||||||
|
# https://leetcode.com/problems/first-missing-positive/
|
||||||
|
|
||||||
|
def detect(l):
|
||||||
|
pass
|
||||||
|
|
||||||
|
assert detect(a) == (3, 6)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[2,4,5,6,6]=23
|
||||||
|
[2,3,4,5,6]=17
|
||||||
|
min=2
|
||||||
|
max=6
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=====
|
||||||
|
6:2
|
||||||
|
2:1
|
||||||
|
5:1
|
||||||
|
4:1
|
||||||
|
=====
|
||||||
|
|
||||||
|
2,3
|
||||||
|
|
||||||
|
sum(keys)=17
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
min=2
|
||||||
|
max=6
|
||||||
|
|
||||||
|
max-min=4
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[1,2,4]
|
||||||
|
[1,2,3]
|
||||||
|
|
||||||
|
|
||||||
|
min+...+max
|
||||||
|
|
||||||
|
expect
|
||||||
|
2+3+4+5+6
|
||||||
|
20
|
||||||
|
|
||||||
|
actual
|
||||||
|
23
|
||||||
|
|
||||||
|
|
||||||
|
2+3+4+5+6=20
|
||||||
|
2+4+5+6+6=23
|
||||||
|
|
||||||
|
missing = sum(actual) - sum(expected)
|
||||||
|
duplicate =
|
||||||
|
|
||||||
51
_code/interviews/test.py
Normal file
51
_code/interviews/test.py
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
|
||||||
|
# map and lambda
|
||||||
|
arr = [1,2,3]
|
||||||
|
sqrt = map(lambda x: x*x, arr)
|
||||||
|
print(arr)
|
||||||
|
print( list(sqrt) )
|
||||||
|
|
||||||
|
|
||||||
|
# list comprehension
|
||||||
|
# Find all of the numbers from 1-1000 that are divisible by 7
|
||||||
|
# results = [num for num in range(1000) if num % 7 == 0]
|
||||||
|
# print(results)
|
||||||
|
|
||||||
|
# res = []
|
||||||
|
# for n in range(1000):
|
||||||
|
# if n % 7 == 0:
|
||||||
|
# res.append(n)
|
||||||
|
# print(res)
|
||||||
|
|
||||||
|
|
||||||
|
# new_list = [expression(i) for i in old_list if filter(i)]
|
||||||
|
new_list = [i**2 for i in range(1,10) if i>5]
|
||||||
|
print(new_list)
|
||||||
|
|
||||||
|
arr = [1,6,7,5,9]
|
||||||
|
list2 = [ i/2 for i in arr if i > 3 ] # expression happens first, then the filter on i happens before the expression
|
||||||
|
print( list2 )
|
||||||
|
|
||||||
|
# zip
|
||||||
|
|
||||||
|
|
||||||
|
print("start fib testing")
|
||||||
|
|
||||||
|
def fib(n):
|
||||||
|
|
||||||
|
res = [ 0 for i in range(n) ]
|
||||||
|
res[1] = 1
|
||||||
|
|
||||||
|
i=3
|
||||||
|
while i<=n:
|
||||||
|
|
||||||
|
res[i-1] = res[i-2] + res[i-3]
|
||||||
|
i+=1
|
||||||
|
|
||||||
|
print(res)
|
||||||
|
|
||||||
|
|
||||||
|
fib(3)
|
||||||
|
fib(4)
|
||||||
|
fib(10)
|
||||||
|
|
||||||
54
_code/linked_list/linkedListcycle.py
Normal file
54
_code/linked_list/linkedListcycle.py
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
|
||||||
|
|
||||||
|
class LinkedListNode:
|
||||||
|
|
||||||
|
def __init__(self, val):
|
||||||
|
|
||||||
|
self.val = val
|
||||||
|
self.next = None
|
||||||
|
|
||||||
|
|
||||||
|
def hasCycle(head):
|
||||||
|
|
||||||
|
if not head:
|
||||||
|
return False
|
||||||
|
|
||||||
|
set = {}
|
||||||
|
|
||||||
|
while head:
|
||||||
|
|
||||||
|
if head in set:
|
||||||
|
return True # cycle detected
|
||||||
|
else:
|
||||||
|
set[head] = None # add node to set
|
||||||
|
|
||||||
|
# next node
|
||||||
|
head = head.next
|
||||||
|
|
||||||
|
# exited loop
|
||||||
|
return False
|
||||||
|
|
||||||
|
# map = {}
|
||||||
|
# while head:
|
||||||
|
|
||||||
|
# if head.next and head.next.val not in map:
|
||||||
|
# map[head.val] = head.next.val
|
||||||
|
# else:
|
||||||
|
|
||||||
|
# if head.next == None:
|
||||||
|
# return False
|
||||||
|
# else:
|
||||||
|
# return True
|
||||||
|
|
||||||
|
# head = head.next
|
||||||
|
|
||||||
|
# return False
|
||||||
|
|
||||||
|
|
||||||
|
head = LinkedListNode(1)
|
||||||
|
head.next = LinkedListNode(2)
|
||||||
|
head.next.next = LinkedListNode(3)
|
||||||
|
# head.next.next.next = head.next
|
||||||
|
|
||||||
|
|
||||||
|
print( hasCycle(head) )
|
||||||
45
_code/linked_list/linkedListcyclefloydd.py
Normal file
45
_code/linked_list/linkedListcyclefloydd.py
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
|
||||||
|
|
||||||
|
class LinkedListNode:
|
||||||
|
|
||||||
|
def __init__(self, val):
|
||||||
|
|
||||||
|
self.val = val
|
||||||
|
self.next = None
|
||||||
|
|
||||||
|
|
||||||
|
def hasCycle(head):
|
||||||
|
|
||||||
|
if not head:
|
||||||
|
return False
|
||||||
|
|
||||||
|
slow = head
|
||||||
|
fast = head.next
|
||||||
|
|
||||||
|
while True:
|
||||||
|
|
||||||
|
# if either pointer is null, reached end of list and return False
|
||||||
|
if slow is None or fast is None or fast.next is None:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# cycle detected, exit and return True
|
||||||
|
if slow is fast:
|
||||||
|
return True
|
||||||
|
|
||||||
|
# advance pointers
|
||||||
|
slow=slow.next
|
||||||
|
fast=fast.next.next
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
head = LinkedListNode(1)
|
||||||
|
head.next = LinkedListNode(2)
|
||||||
|
head.next = head
|
||||||
|
# head.next.next = LinkedListNode(3)
|
||||||
|
# # head.next.next.next = head.next
|
||||||
|
|
||||||
|
|
||||||
|
print( hasCycle(head) )
|
||||||
38
_code/linked_list/mergeSortedLinkedList.py
Normal file
38
_code/linked_list/mergeSortedLinkedList.py
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
class LinkedListNode:
|
||||||
|
|
||||||
|
def __init__(self, val):
|
||||||
|
|
||||||
|
self.val = val
|
||||||
|
self.next = None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def mergeSortedLinkedList(l1, l2):
|
||||||
|
|
||||||
|
dummy = ListNode(0)
|
||||||
|
head = dummy
|
||||||
|
while l1 and l2 :
|
||||||
|
if l1.val < l2.val :
|
||||||
|
dummy.next = l1
|
||||||
|
l1 = l1.next
|
||||||
|
else :
|
||||||
|
dummy.next = l2
|
||||||
|
l2 = l2.next
|
||||||
|
dummy = dummy.next
|
||||||
|
|
||||||
|
if l1 :
|
||||||
|
dummy.next = l1
|
||||||
|
elif l2 :
|
||||||
|
dummy.next = l2
|
||||||
|
return head.next
|
||||||
|
|
||||||
|
|
||||||
|
l1 = LinkedListNode(1)
|
||||||
|
l1.next = LinkedListNode(2)
|
||||||
|
l1.next.next = LinkedListNode(4)
|
||||||
|
|
||||||
|
l2 = LinkedListNode(1)
|
||||||
|
l2.next = LinkedListNode(3)
|
||||||
|
l2.next = LinkedListNode(4)
|
||||||
|
|
||||||
|
mergeSortedLinkedList()
|
||||||
53
_code/linked_list/mergeSortedLists.py
Normal file
53
_code/linked_list/mergeSortedLists.py
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
class LinkedListNode:
|
||||||
|
|
||||||
|
def __init__(self, val):
|
||||||
|
|
||||||
|
self.val = val
|
||||||
|
self.next = None
|
||||||
|
|
||||||
|
|
||||||
|
l1 = LinkedListNode(1)
|
||||||
|
l1.next = LinkedListNode(2)
|
||||||
|
l1.next.next = LinkedListNode(4)
|
||||||
|
|
||||||
|
|
||||||
|
l2 = LinkedListNode(1)
|
||||||
|
l2.next = LinkedListNode(3)
|
||||||
|
l2.next.next = LinkedListNode(4)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def mergeSortedLists(l1, l2):
|
||||||
|
|
||||||
|
dummy = LinkedListNode(0)
|
||||||
|
curr = dummy
|
||||||
|
|
||||||
|
while l1 and l2:
|
||||||
|
|
||||||
|
if l1.val <= l2.val:
|
||||||
|
curr.next = l1
|
||||||
|
curr = l1
|
||||||
|
l1 = l1.next
|
||||||
|
else:
|
||||||
|
curr.next = l2
|
||||||
|
curr = l2
|
||||||
|
l2 = l2.next
|
||||||
|
|
||||||
|
while l1:
|
||||||
|
curr.next = l1
|
||||||
|
curr = l1
|
||||||
|
l1 = l1.next
|
||||||
|
|
||||||
|
while l2:
|
||||||
|
curr.next = l2
|
||||||
|
curr = l2
|
||||||
|
l2 = l2.next
|
||||||
|
|
||||||
|
return dummy.next
|
||||||
|
|
||||||
|
head = mergeSortedLists(l1, l2)
|
||||||
|
|
||||||
|
curr = head
|
||||||
|
while curr:
|
||||||
|
print(curr.val)
|
||||||
|
curr=curr.next
|
||||||
43
_code/linked_list/mergeSortedListsRecursive.py
Normal file
43
_code/linked_list/mergeSortedListsRecursive.py
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
class LinkedListNode:
|
||||||
|
|
||||||
|
def __init__(self, val):
|
||||||
|
|
||||||
|
self.val = val
|
||||||
|
self.next = None
|
||||||
|
|
||||||
|
|
||||||
|
l1 = LinkedListNode(1)
|
||||||
|
l1.next = LinkedListNode(2)
|
||||||
|
l1.next.next = LinkedListNode(4)
|
||||||
|
|
||||||
|
|
||||||
|
l2 = LinkedListNode(2)
|
||||||
|
l2.next = LinkedListNode(3)
|
||||||
|
l2.next.next = LinkedListNode(4)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def mergeSortedLists(l1, l2):
|
||||||
|
|
||||||
|
if not l1:
|
||||||
|
return l2
|
||||||
|
|
||||||
|
if not l2:
|
||||||
|
return l1
|
||||||
|
|
||||||
|
if l1.val < l2.val:
|
||||||
|
l1.next = mergeSortedLists(l1.next, l2)
|
||||||
|
return l1
|
||||||
|
else:
|
||||||
|
l2.next = mergeSortedLists(l2.next, l1)
|
||||||
|
return l2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
head = mergeSortedLists(l1, l2)
|
||||||
|
|
||||||
|
curr = head
|
||||||
|
while curr:
|
||||||
|
print(curr.val)
|
||||||
|
curr=curr.next
|
||||||
25
_code/linked_list/palindromelinkedlist.py
Normal file
25
_code/linked_list/palindromelinkedlist.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
class LinkedListNode:
|
||||||
|
|
||||||
|
def __init__(self, val):
|
||||||
|
|
||||||
|
self.val = val
|
||||||
|
self.next = None
|
||||||
|
|
||||||
|
|
||||||
|
def palindromeLinkedList(head):
|
||||||
|
|
||||||
|
slow, fast = head, head
|
||||||
|
|
||||||
|
while fast and fast.next:
|
||||||
|
slow = slow.next
|
||||||
|
fast = fast.next.next
|
||||||
|
|
||||||
|
print(slow)
|
||||||
|
print(fast)
|
||||||
|
|
||||||
|
head = LinkedListNode(1)
|
||||||
|
head.next = LinkedListNode(2)
|
||||||
|
head.next.next = LinkedListNode(2)
|
||||||
|
head.next.next.next = LinkedListNode(1)
|
||||||
|
|
||||||
|
palindromeLinkedList(head)
|
||||||
50
_code/linked_list/reverse/reverseLinkedList.py
Normal file
50
_code/linked_list/reverse/reverseLinkedList.py
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
class LinkedListNode:
|
||||||
|
|
||||||
|
def __init__(self, val):
|
||||||
|
|
||||||
|
self.val = val
|
||||||
|
self.next = None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def reverse(head):
|
||||||
|
|
||||||
|
curr = head
|
||||||
|
prev = None
|
||||||
|
next = None
|
||||||
|
|
||||||
|
while curr:
|
||||||
|
|
||||||
|
# save next node
|
||||||
|
next = curr.next
|
||||||
|
|
||||||
|
# reverse curr's pointer
|
||||||
|
curr.next = prev
|
||||||
|
|
||||||
|
# advance curr and prev
|
||||||
|
prev = curr
|
||||||
|
curr = next
|
||||||
|
|
||||||
|
head = prev
|
||||||
|
return head
|
||||||
|
|
||||||
|
|
||||||
|
head = LinkedListNode(1)
|
||||||
|
head.next = LinkedListNode(2)
|
||||||
|
head.next.next = LinkedListNode(3)
|
||||||
|
|
||||||
|
# print list
|
||||||
|
node = head
|
||||||
|
while node:
|
||||||
|
print(node.val)
|
||||||
|
node = node.next
|
||||||
|
|
||||||
|
|
||||||
|
head = reverse(head)
|
||||||
|
|
||||||
|
|
||||||
|
# print list
|
||||||
|
node = head
|
||||||
|
while node:
|
||||||
|
print(node.val)
|
||||||
|
node = node.next
|
||||||
35
_code/linked_list/reverse/reverseLinkedListRecursive.py
Normal file
35
_code/linked_list/reverse/reverseLinkedListRecursive.py
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
class LinkedListNode:
|
||||||
|
|
||||||
|
def __init__(self, val):
|
||||||
|
|
||||||
|
self.val = val
|
||||||
|
self.next = None
|
||||||
|
|
||||||
|
|
||||||
|
def reverse(head):
|
||||||
|
|
||||||
|
if not head:
|
||||||
|
return
|
||||||
|
|
||||||
|
head.next = reverse(head)
|
||||||
|
|
||||||
|
|
||||||
|
head = LinkedListNode(1)
|
||||||
|
head.next = LinkedListNode(2)
|
||||||
|
head.next.next = LinkedListNode(3)
|
||||||
|
|
||||||
|
# print list
|
||||||
|
node = head
|
||||||
|
while node:
|
||||||
|
print(node.val)
|
||||||
|
node = node.next
|
||||||
|
|
||||||
|
|
||||||
|
head = reverse(head)
|
||||||
|
|
||||||
|
|
||||||
|
# print list
|
||||||
|
node = head
|
||||||
|
while node:
|
||||||
|
print(node.val)
|
||||||
|
node = node.next
|
||||||
65
_code/linked_list/reverse/reverseSublist.py
Normal file
65
_code/linked_list/reverse/reverseSublist.py
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
class LinkedListNode:
|
||||||
|
|
||||||
|
def __init__(self, val):
|
||||||
|
|
||||||
|
self.val = val
|
||||||
|
self.next = None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def reverseBetween(head, m, n):
|
||||||
|
|
||||||
|
prev = None
|
||||||
|
curr = head
|
||||||
|
|
||||||
|
# move prev and curr up to m
|
||||||
|
while m>1:
|
||||||
|
prev = curr
|
||||||
|
curr = curr.next
|
||||||
|
m-=1
|
||||||
|
n-=1
|
||||||
|
|
||||||
|
# connect beginning with reversed part
|
||||||
|
connection = prev
|
||||||
|
tail = curr
|
||||||
|
|
||||||
|
while n>0:
|
||||||
|
next = curr.next
|
||||||
|
curr.next = prev
|
||||||
|
prev = curr
|
||||||
|
curr = next
|
||||||
|
n-=1
|
||||||
|
|
||||||
|
if connection:
|
||||||
|
connection.next = prev
|
||||||
|
else:
|
||||||
|
head = prev
|
||||||
|
|
||||||
|
tail.next = curr
|
||||||
|
return head
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
head = LinkedListNode(1)
|
||||||
|
head.next = LinkedListNode(2)
|
||||||
|
head.next.next = LinkedListNode(3)
|
||||||
|
head.next.next.next = LinkedListNode(4)
|
||||||
|
head.next.next.next.next = LinkedListNode(5)
|
||||||
|
|
||||||
|
# print list
|
||||||
|
node = head
|
||||||
|
while node:
|
||||||
|
print(node.val)
|
||||||
|
node = node.next
|
||||||
|
|
||||||
|
|
||||||
|
head = reverseBetween(head, 2, 4)
|
||||||
|
|
||||||
|
|
||||||
|
# print list
|
||||||
|
|
||||||
|
print("\nresults:")
|
||||||
|
node = head
|
||||||
|
while node:
|
||||||
|
print(node.val)
|
||||||
|
node = node.next
|
||||||
50
_code/math/countNumbersWithUniqueDigits.py
Normal file
50
_code/math/countNumbersWithUniqueDigits.py
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
'''
|
||||||
|
|
||||||
|
https://leetcode.com/problems/count-numbers-with-unique-digits/
|
||||||
|
|
||||||
|
'''
|
||||||
|
|
||||||
|
# from math import *
|
||||||
|
import math
|
||||||
|
|
||||||
|
|
||||||
|
def isUniqueInteger(n):
|
||||||
|
|
||||||
|
mymap = dict()
|
||||||
|
|
||||||
|
while(n>0):
|
||||||
|
digit=n%10
|
||||||
|
#print(digit)
|
||||||
|
|
||||||
|
if not digit in mymap:
|
||||||
|
mymap[digit] = 1
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
n=n//10
|
||||||
|
|
||||||
|
#print(mymap)
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def countNumbersWithUniqueDigits(n):
|
||||||
|
|
||||||
|
count = 0
|
||||||
|
|
||||||
|
for i in range(0, pow(10, n)):
|
||||||
|
if isUniqueInteger(i):
|
||||||
|
count = count + 1
|
||||||
|
|
||||||
|
return count
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
# countNumbersWithUniqueDigits(None, 2)
|
||||||
|
print( countNumbersWithUniqueDigits(2) )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
39
_code/math/int_to_string.py
Normal file
39
_code/math/int_to_string.py
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
|
||||||
|
|
||||||
|
'''
|
||||||
|
EPI; 6.1
|
||||||
|
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
# the input
|
||||||
|
x = -123
|
||||||
|
|
||||||
|
s = []
|
||||||
|
|
||||||
|
# deal with negative case
|
||||||
|
is_neg = False
|
||||||
|
if x < 0:
|
||||||
|
is_neg = True
|
||||||
|
x = abs(x)
|
||||||
|
|
||||||
|
# deal with the happy case
|
||||||
|
while True:
|
||||||
|
|
||||||
|
s.append( chr( ord('0') + x%10 ) ) # ord() returns unicode of digit, chr() returns char of unicode
|
||||||
|
x//=10
|
||||||
|
|
||||||
|
if x==0:
|
||||||
|
break
|
||||||
|
|
||||||
|
print (s)
|
||||||
|
|
||||||
|
print ('-' + ''.join(reversed(s)) if is_neg else reversed(s)) # reversed() returns an iterator, ''.join() concontenates iterators
|
||||||
|
# print ('-' if is_neg else '') + ''.join(reversed(s))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
28
_code/math/plusOne.py
Normal file
28
_code/math/plusOne.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
import math
|
||||||
|
|
||||||
|
# digits = [6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3]
|
||||||
|
digits = [7,2,8,5,0,9,1,2,9,5,3,6,6,7,3,2,8,4,3,7,9,5,7,7,4,7,4,9,4,7,0,1,1,1,7,4,0,0,6]
|
||||||
|
|
||||||
|
def plusOne(digits):
|
||||||
|
num = 0
|
||||||
|
exp = 0
|
||||||
|
for i in reversed(range(len(digits))):
|
||||||
|
print(num, math.pow(10, exp), pow(10, exp), 10**exp)
|
||||||
|
num += math.floor( digits[i] * (10**exp))
|
||||||
|
exp+=1
|
||||||
|
|
||||||
|
|
||||||
|
plusOne = int(num+1)
|
||||||
|
|
||||||
|
|
||||||
|
res = []
|
||||||
|
while plusOne>0:
|
||||||
|
|
||||||
|
pop = plusOne%10
|
||||||
|
res = [pop] + res
|
||||||
|
plusOne = plusOne//10
|
||||||
|
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
print(plusOne(digits))
|
||||||
36
_code/math/reveseInteger.py
Normal file
36
_code/math/reveseInteger.py
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import math
|
||||||
|
|
||||||
|
num = 1534236469
|
||||||
|
|
||||||
|
def reverse(num):
|
||||||
|
|
||||||
|
# handle negative case
|
||||||
|
neg = False
|
||||||
|
if num<0:
|
||||||
|
neg = True
|
||||||
|
num = abs(num)
|
||||||
|
|
||||||
|
rev = 0
|
||||||
|
|
||||||
|
while num>0:
|
||||||
|
|
||||||
|
# pop last digit
|
||||||
|
popped = num % 10
|
||||||
|
num = math.floor(num / 10)
|
||||||
|
|
||||||
|
# handle overflow
|
||||||
|
if (rev > 2**31 / 10) or (rev == 2**31 / 10 and popped>7): return 0
|
||||||
|
if (rev < -2**31 / 10) or (rev == -2**31 / 10 and popped<-8): return 0
|
||||||
|
|
||||||
|
rev = rev * 10 + popped
|
||||||
|
|
||||||
|
print(num, popped, rev)
|
||||||
|
|
||||||
|
|
||||||
|
return rev*-1 if neg else rev
|
||||||
|
|
||||||
|
print( reverse(num) )
|
||||||
|
# print( reverse(123) )
|
||||||
|
# print( reverse(-123) )
|
||||||
|
# print( reverse(2**31) )
|
||||||
|
# print( reverse(-2**31) )
|
||||||
18
_code/math/string_to_int.py
Normal file
18
_code/math/string_to_int.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
|
||||||
|
|
||||||
|
'''
|
||||||
|
EPI; 6.1
|
||||||
|
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
# the input
|
||||||
|
x = -123
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
25
_code/math/uglyNum2.py
Normal file
25
_code/math/uglyNum2.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
n=1690
|
||||||
|
|
||||||
|
def nthUglyNumber(n):
|
||||||
|
|
||||||
|
uglyNums = [1]
|
||||||
|
|
||||||
|
curr = 2
|
||||||
|
while len(uglyNums)<n:
|
||||||
|
|
||||||
|
print(curr)
|
||||||
|
|
||||||
|
# factorize
|
||||||
|
if curr%5==0 and int(curr/5) in uglyNums:
|
||||||
|
uglyNums.append(curr)
|
||||||
|
elif curr%3==0 and int(curr/3) in uglyNums:
|
||||||
|
uglyNums.append(curr)
|
||||||
|
elif curr%2==0 and int(curr/2) in uglyNums:
|
||||||
|
uglyNums.append(curr)
|
||||||
|
|
||||||
|
curr+=1
|
||||||
|
|
||||||
|
|
||||||
|
return uglyNums[-1]
|
||||||
|
|
||||||
|
print(nthUglyNumber(n))
|
||||||
45
_code/matrix/matrix_transversal.py
Normal file
45
_code/matrix/matrix_transversal.py
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
|
||||||
|
bo = [
|
||||||
|
|
||||||
|
[1,2,3],
|
||||||
|
[4,5,6],
|
||||||
|
[7,8,9],
|
||||||
|
[10,11,12]
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
print( bo[1][2] ) # 1 down, 2 right
|
||||||
|
|
||||||
|
print(len(bo))
|
||||||
|
print()
|
||||||
|
|
||||||
|
print('\nprinting row')
|
||||||
|
for i in range(len(bo)-1):
|
||||||
|
print(bo[0][i])
|
||||||
|
|
||||||
|
|
||||||
|
print('\nprinting col')
|
||||||
|
for col in range(len(bo)-1):
|
||||||
|
print(bo[col][0])
|
||||||
|
|
||||||
|
|
||||||
|
print('\nprint both (horizontally first)')
|
||||||
|
for row in range(len(bo)):
|
||||||
|
print(bo[row])
|
||||||
|
|
||||||
|
print('\nprint both (horizontally first, element by element)')
|
||||||
|
for row in range(len(bo)): # horizontal first, loop over "row" first
|
||||||
|
|
||||||
|
print(bo[row])
|
||||||
|
for col in range(len(bo[0])):
|
||||||
|
print(bo[row][col])
|
||||||
|
|
||||||
|
print('\nprint both (vertically first, element by element)')
|
||||||
|
for col in range(len(bo[0])): # vertical first, loop over col first
|
||||||
|
|
||||||
|
print("row of :" + str(bo[0][col] ) )
|
||||||
|
for row in range(len(bo)):
|
||||||
|
print(bo[row][col])
|
||||||
|
|
||||||
|
print('\njust gets first column using list comprehension')
|
||||||
|
print( [i[0] for i in bo] )
|
||||||
43
_code/matrix/rotateMatrix/rotateMatrix.py
Normal file
43
_code/matrix/rotateMatrix/rotateMatrix.py
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
'''
|
||||||
|
rotate 90 degree = transpose + flip horizontally
|
||||||
|
https://www.geeksforgeeks.org/rotate-matrix-90-degree-without-using-extra-space-set-2/?ref=rp
|
||||||
|
'''
|
||||||
|
|
||||||
|
mat = [
|
||||||
|
[1,2,3],
|
||||||
|
[4,5,6],
|
||||||
|
[7,8,9]
|
||||||
|
]
|
||||||
|
|
||||||
|
def rotateMatrix(mat):
|
||||||
|
|
||||||
|
n = len(mat)
|
||||||
|
|
||||||
|
for i in range(n):
|
||||||
|
for j in range(i,n):
|
||||||
|
tmp = mat[i][j]
|
||||||
|
mat[i][j] = mat[j][i]
|
||||||
|
mat[j][i] = tmp
|
||||||
|
|
||||||
|
for row in mat:
|
||||||
|
print(row)
|
||||||
|
|
||||||
|
|
||||||
|
print("after second rotation")
|
||||||
|
|
||||||
|
for i in range(n):
|
||||||
|
for j in range(n//2):
|
||||||
|
tmp = mat[i][j]
|
||||||
|
mat[i][j] = mat[i][n-j-1]
|
||||||
|
mat[i][n-j-1] = tmp
|
||||||
|
|
||||||
|
for row in mat:
|
||||||
|
print(row)
|
||||||
|
|
||||||
|
|
||||||
|
return mat
|
||||||
|
|
||||||
|
print(rotateMatrix(mat))
|
||||||
|
|
||||||
|
# for row in mat:
|
||||||
|
# print(row)
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user