[Lintcode]184. Largest Number/[Leetcode]179. Largest Number
阿新 • • 發佈:2019-02-10
cti code sele des form 參考 ace nlog map
184. Largest Number/179. Largest Number
- 本題難度: Medium
- Topic: Greedy
Description
- Largest Number
中文English
Given a list of non negative integers, arrange them such that they form the largest number.
Example
Given [1, 20, 23, 4, 8], the largest formed number is 8423201.
Challenge
Do it in O(nlogn) time complexity.
Notice
The result may be very large, so you need to return a string instead of an integer.
別人的代碼
參考1
from functools import cmp_to_key class Solution: def largestNumber(self, nums): def cmp(a, b): return int(b + a) - int(a + b) nums = list(map(str, nums)) nums.sort(key=cmp_to_key(cmp)) return ‘‘.join(nums).lstrip(‘0‘) or ‘0‘‘
參考2
# build-in function def largestNumber1(self, nums): if not any(nums): return "0" return "".join(sorted(map(str, nums), cmp=lambda n1, n2: -1 if n1+n2>n2+n1 else (1 if n1+n2<n2+n1 else 0))) # bubble sort def largestNumber2(self, nums): for i in xrange(len(nums), 0, -1): for j in xrange(i-1): if not self.compare(nums[j], nums[j+1]): nums[j], nums[j+1] = nums[j+1], nums[j] return str(int("".join(map(str, nums)))) def compare(self, n1, n2): return str(n1) + str(n2) > str(n2) + str(n1) # selection sort def largestNumber3(self, nums): for i in xrange(len(nums), 0, -1): tmp = 0 for j in xrange(i): if not self.compare(nums[j], nums[tmp]): tmp = j nums[tmp], nums[i-1] = nums[i-1], nums[tmp] return str(int("".join(map(str, nums)))) # insertion sort def largestNumber4(self, nums): for i in xrange(len(nums)): pos, cur = i, nums[i] while pos > 0 and not self.compare(nums[pos-1], cur): nums[pos] = nums[pos-1] # move one-step forward pos -= 1 nums[pos] = cur return str(int("".join(map(str, nums)))) # merge sort def largestNumber5(self, nums): nums = self.mergeSort(nums, 0, len(nums)-1) return str(int("".join(map(str, nums)))) def mergeSort(self, nums, l, r): if l > r: return if l == r: return [nums[l]] mid = l + (r-l)//2 left = self.mergeSort(nums, l, mid) right = self.mergeSort(nums, mid+1, r) return self.merge(left, right) def merge(self, l1, l2): res, i, j = [], 0, 0 while i < len(l1) and j < len(l2): if not self.compare(l1[i], l2[j]): res.append(l2[j]) j += 1 else: res.append(l1[i]) i += 1 res.extend(l1[i:] or l2[j:]) return res # quick sort, in-place def largestNumber(self, nums): self.quickSort(nums, 0, len(nums)-1) return str(int("".join(map(str, nums)))) def quickSort(self, nums, l, r): if l >= r: return pos = self.partition(nums, l, r) self.quickSort(nums, l, pos-1) self.quickSort(nums, pos+1, r) def partition(self, nums, l, r): low = l while l < r: if self.compare(nums[l], nums[r]): nums[l], nums[low] = nums[low], nums[l] low += 1 l += 1 nums[low], nums[r] = nums[r], nums[low] return low
思路
- 時間復雜度
- 出錯
[Lintcode]184. Largest Number/[Leetcode]179. Largest Number