剑指 Offer 45 - 把数组排成最小的数
# 📃 题目描述
题目链接:剑指 Offer 45. 把数组排成最小的数 (opens new window)
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
输入: [10,2]
输出: "102"
示例 2:
输入: [3,30,34,5,9]
输出: "3033459"
# 🔔 解题思路
就是排序,不过这题的排序的比较条件就不一样了
需要找到最小的数字排列,如果 a + b < b + a,那么 a 就应该在 b 的前面,以快速排序为例:
直接利用 String 的 compareTo 方法来比较两数的大小
class Solution {
public String minNumber(int[] nums) {
if (nums == null || nums.length == 0) {
return "";
}
String[] strs = new String[nums.length];
for (int i = 0; i < nums.length; i ++) {
strs[i] = String.valueOf(nums[i]);
}
quickSort(strs, 0, strs.length - 1);
StringBuilder sb = new StringBuilder();
for (String s : strs) {
sb.append(s);
}
return sb.toString();
}
private void quickSort(String[] strs, int left, int right) {
if (left >= right) {
return ;
}
int pivot = partition(strs, left, right);
quickSort(strs, left, pivot - 1);
quickSort(strs, pivot + 1, right);
}
private int partition(String[] strs, int left, int right) {
if (left == right) {
return left;
}
int pivot = left;
while (left < right) {
while (left < right && (strs[pivot] + strs[right]).compareTo(strs[right] + strs[pivot]) <= 0) {
right --;
}
while (left < right && (strs[left] + strs[pivot]).compareTo(strs[pivot] + strs[left]) <= 0) {
left ++;
}
if (left < right) {
swap(strs, left, right);
}
}
swap(strs, left, pivot);
return left;
}
private void swap(String[] strs, int l, int r) {
String temp = strs[l];
strs[l] = strs[r];
strs[r] = temp;
}
}
或者直接用 Arrays.sort()
class Solution {
public String minNumber(int[] nums) {
if (nums == null || nums.length == 0) {
return "";
}
String[] strs = new String[nums.length];
for (int i = 0; i < nums.length; i ++) {
strs[i] = String.valueOf(nums[i]);
}
Arrays.sort(strs, (o1, o2) -> (o1 + o2).compareTo(o2 + o1));
StringBuilder sb = new StringBuilder();
for (String s : strs) {
sb.append(s);
}
return sb.toString();
}
}
# 💥 复杂度分析
- 空间复杂度:
- 时间复杂度:
🎁 公众号

各位小伙伴大家好呀,叫我小牛肉就行,目前在读东南大学硕士,上方扫码关注公众号「飞天小牛肉」,与你分享我的成长历程与技术感悟~
帮助小牛肉改善此页面 (opens new window)
Last Updated: 2023/02/16, 11:27:10