Skip to content

Commit 9386395

Browse files
authored
Create minimum-adjacent-swaps-to-reach-the-kth-smallest-number.py
1 parent b1d95ce commit 9386395

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# Time: O((k + n) * n)
2+
# Space: O(n)
3+
4+
class Solution(object):
5+
def getMinSwaps(self, num, k):
6+
"""
7+
:type num: str
8+
:type k: int
9+
:rtype: int
10+
"""
11+
def next_permutation(nums, begin, end):
12+
def reverse(nums, begin, end):
13+
left, right = begin, end-1
14+
while left < right:
15+
nums[left], nums[right] = nums[right], nums[left]
16+
left += 1
17+
right -= 1
18+
19+
k, l = begin-1, begin
20+
for i in reversed(xrange(begin, end-1)):
21+
if nums[i] < nums[i+1]:
22+
k = i
23+
break
24+
else:
25+
reverse(nums, begin, end)
26+
return False
27+
for i in reversed(xrange(k+1, end)):
28+
if nums[i] > nums[k]:
29+
l = i
30+
break
31+
nums[k], nums[l] = nums[l], nums[k]
32+
reverse(nums, k+1, end)
33+
return True
34+
35+
new_num = list(num)
36+
while k:
37+
next_permutation(new_num, 0, len(new_num))
38+
k -= 1
39+
result = 0
40+
for i in xrange(len(new_num)):
41+
if new_num[i] == num[i]:
42+
continue
43+
# // greedily move the one with the least cost from new_num to num without missing optimal cost
44+
for j in xrange(i+1, len(new_num)):
45+
if new_num[j] == num[i]:
46+
break
47+
result += j-i
48+
for j in reversed(xrange(i+1, j+1)):
49+
new_num[j], new_num[j-1] = new_num[j-1], new_num[j]
50+
return result

0 commit comments

Comments
 (0)