面试题 16.16. 部分排序(C++实现)

文章目录

题目

题目链接:面试题 16.16. 部分排序
在这里插入图片描述


思路

部分排序思路:要找未排好序的数,其实就是找它的逆序对
如何找逆序对呢?如何确认逆序对的范围呢?
逆序对就是相对于原来的排序顺序是相反的,比如原来是从左到右升序,那么你从左到右如果右降序的,那么就是逆序对了

确认最右边逆序对的范围?确认左边逆序对的范围?

确认最右边的:
数组从左到右是增大的,我们用cur遍历数组,找到其最大的一个值max,用nums[cur]和它比较;
只要nums[cur] > max 还要大,那么就更新max,同时cur继续往前走;
只要nums[cur] < max ,那么说明开始发现逆序对了,因为我们原来排序的位置是从小到大,但是遍历却发现有小的数字出现,这表明有逆序对;
发现逆序对之后,就先记录改位置,由于还没有确认是最右边的逆序对,所以还需要继续遍历;

确认最左边的:
思路和确认最右边的一幕一样,只不过遍历不是从数组1开始,而是从数组后面开始,不是找最大值,而是最小值;


初始条件:
在这里插入图片描述
在这里插入图片描述

结束条件:
在这里插入图片描述

class Solution {
public:
    vector<int> subSort(vector<int>& nums) {
        if (nums.size() == 0) return vector<int>{-1, -1};
	int max = nums[0]; //假设第一个最大,我们就可以从数组下标为1的位置开始遍历
	int right = -1;
	for (int cur = 1; cur < nums.size(); cur++)
	{
		if (nums[cur] >= max)
		{
			max = nums[cur];
		}
		else
		{
			right = cur;
		}
	}
	int min = nums[nums.size()-1];//假设最后一个最大,我们就可以从数组下标为倒数第二个的位置开始遍历
	int left = -1;
	for (int cur = nums.size()-2; cur >=0; cur--)
	{
		if (nums[cur] <= min)
		{
			min = nums[cur];
		}
		else //若nums[cur] > min说明有逆序对啦,那么就跟新left
		{
			left = cur;
		}
	}
	return vector<int>{left, right};
    }
};
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呋喃吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值