栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

剑指offer45把数组排成最小的数

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

剑指offer45把数组排成最小的数

一、题目 剑指 Offer 45. 把数组排成最小的数 题目描述

输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

示例1:

输入: [10,2]
输出: "102"

示例2:

输入: [3,30,34,5,9]
输出: "3033459"
二、分析 1.方法1:暴力组合法

我们可能下意识会想到用DFS求组合的方法,将所有情况暴力枚举出来。然后再比较得到最小的组合方法。

时间复杂度:组合O(n!)+ 比较O(n)

空间复杂度:O(n)

时间复杂度太高,此方法是下策,所以我们暂时不考虑用此种方法。

2.方法2:排序法

此题难点就是考虑将其转换成排序问题。题目要求的是数组组合成最小的数,问题就是如何将数组组合才能使其最小。

我们定义了一种排序规则:

x,y是数组两个数。如果组合xy 

定义了该规则后,将整个数组从小到大排序就能得到数组最小数组合了。

三、代码 1.自己写快排(自己造轮子)
	
	string minNumberA(vector& nums) {
		//利用快速排序
		QuikSortA(0, nums.size() - 1, nums);
		string res;
		for (int i : nums) {
			res.append(to_string(i));
		}
		return res;
	}
	bool myCompare(int a, int b) {
		return to_string(a) + to_string(b) < to_string(b) + to_string(a);
	}
	int partitionA(vector& nums, int first, int last) {
		int privot = nums[first];
		while (first < last) {
			while (first < last && !myCompare(nums[last], privot)) {
				--last;
			}
			nums[first] = nums[last];
			while (first < last && myCompare(nums[first], privot)) {
				++first;
			}
			nums[last] = nums[first];
		}
		nums[first] = privot;
		return first;

	}
	void QuikSortA(int low, int high, vector& nums) {
		if (low >= high)return;
		int mid = partitionA(nums, low, high);
		QuikSortA(low, mid - 1, nums);
		QuikSortA(mid + 1, high, nums);
	}
2.利用内置函数实现排序
	
	string minNumberB(vector& nums) {
		string res;
		sort(nums.begin(), nums.end(), [](const int& a, const int& b)->bool {
			return to_string(a) + to_string(b) < to_string(b) + to_string(a);
			});
		for (auto i : nums)
			res.append(to_string(i));
		return res;
	}
四、总结

此题核心是知道怎么转换成排序问题。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/657170.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号