剑指offer:把数组排列成最小的数

索引请参考:系列目录
题目:

  • 输入一个整数数组,把数组例多有数字拼接起来排成一个数,打印出来能拼接出来的所有数字中最小的一个。
  • 示例:
  • 输入:{3,32,321}
  • 输出:321323

分析:
思路1:

  • 该题目主要是对排列组合的考察。如果熟悉对STL熟悉的小伙伴,应该是一道很简单的题目

思路2:

  • 对输入数组转化成string类型,然后对其进行升序排序。得到的便是最小是最小的拼接数

方法1:

std::string ret(number.size(), '9');
	std::sort(number.begin(), number.end());
	do
	{
		std::string temp;
		for (auto elem : number)
			temp += std::to_string(elem);
		ret = std::min(temp, ret);
		std::cout << temp << std::endl;

	} while (std::next_permutation(number.begin(),number.end()));
	
	return ret;

牛客运行结果:
在这里插入图片描述
方法2:

std::vector<std::string> str;
	for (auto elem : number)
		str.push_back(std::to_string(elem));
	auto cmp = [](std::string a,std::string b) {
	
		return a + b < b + a;

	};
	std::sort(str.begin(), str.end(), cmp);
	std::string ret;
	for (auto elem : str)
		ret += elem;
	return ret;

牛客运行结果:
在这里插入图片描述
评注:可以看出两种方法各有利弊。在注重时间效率的情况下,应该更加偏向方法1.在注重空间效率的情况下,应该更加偏向方法2。导致方法2时间效率不高的原因是:用标准模板库中的sort算法。该算法在正常情况下用的快排算法,最差情况下,用的是堆排算法。这样排序算法时间复杂度会从线性变为nlogn。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值