775.全局倒置与局部倒置

本文探讨了三种不同的算法来判断一个数组是否为理想排列,即数组中的局部倒置是否等于全局倒置。首先介绍了两种超时的解法,然后提出了一种正确且高效的解法,通过检查每个元素与其位置的绝对差是否大于1来快速判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

超时解法1:

class Solution {
public:
	bool isIdealPermutation(vector<int>& A) 
	{
		map<int, vector<int>>count;
		/*局部倒置*/
		int Local = 0;
		for (int i = 0; i <A.size(); i++)
		{
			if (i < A.size() - 1)
				if (A[i] > A[i + 1])
					Local++;
			//count[A[i]].push_back(0);
			count[A[i]].push_back(i);
		}
		/*全局倒置*/
		int Global = 0;
		for (auto i = count.begin(); i !=count.end(); i++)
		{
			pair<int, vector<int>>te1 = *i;
			for (auto j = count.begin(); j != count.end(); j++)
			{
				pair<int, vector<int>>te2 = *j;
				if (te2.first < te1.first)
				{
					Global += numbers(te1.second, te2.second);
				}
				else
					break;
			}
		}
		if (Global == Local)
			return true;
		return false;
	}
	int numbers(vector<int>information, vector<int>target)
	{
		int ans = 0;
		if (target.size()==1)
		{
			for (int i = 0; i < information.size(); i++)
			{
				if (information[i] < target[0])
					ans++;
			}
			
		}
		else
			for (int i = 0; i < information.size(); i++)
			{
				int te = information[i];
				for (int j = 0; j < target.size(); j++)
				{
					if (target[j] > te)
					{
						ans += target.size() - j;
						break;
					}
				}
			}
		return ans;
	}
};

超时解法2:

class Solution {
public:
	bool isIdealPermutation(vector<int>& A) {
		for (auto i = A.begin(); i < A.end() - 1; i++)
		{
			if (i + 2 != A.end() && *i > *min_element(i + 2, A.end()))
				return false;
		}
		return true;
	}
};

正确解法:
思路:根据题目要求,数组里的数不存在重复元素,并且,只要是局部倒置就一定是全局倒置,反过来,全局倒置不一定是局部倒置,所有想要全局倒置等于局部倒置,有且仅有一种情况下才可能返回TRUE;那就是所有的全局倒置都是局部倒置:J有且仅有一个值就是I+1;

class Solution {
public:
	bool isIdealPermutation(vector<int>& A) 
	{
		for (int i = 0; i < A.size(); i++)
		{
			if (abs(A[i] - i) > 1)
				return false;
		}
		return true;
	}
};```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值