题目来源
题干简述
题意:
区间范围在[1-2n]的整数
将偶数随机排列在a数组中,奇数随机排列在b数组中
要求进行数组内相邻元素的交换,直到满足a[0]<b[0]
解释
首先想到的是暴力做法
将遍历a每一个元素,在b中查找最近的一个满足ai<bj的元素,并不断更新答案,即对于每个元素a所需要的交换次数并取最小值
很明显看到数据量这个做法会被TLE,复杂度O(N*N)
然后再寻找其他思维失败的基础上,我采取在暴力做法进行优化
对于数组a用一个pair,将数组元素放在first中,元素的下标放在b中
并将pair sort排序
然后对于数组b进行遍历,使用双指针i,j
j指向数组b,更新条件是当b[j]<a[i]的时候
i指向数组a,更新条件是当b[j]>a[i]的时候
特别注意j需要一直遍历到N-1结束
这么做的可行性因为
a[i]被排好序,如果b[j]<a[i],那么对于a[i+1],b前面的元素必然小于a[i+1]
所以b只需要顺序遍历即可
时间复杂度为o(N)
代码段
typedef pair<int, int>pii;
void solve()
{
int n;
cin >> n;
vector<int>a(n), b(n);
for (auto& x : a)cin >> x;
for (auto& x : b)cin >> x;
int res = 1e9, l, pi;
vector<pii>c(n);
for (int i = 0; i < n; i++)
{
c[i].first = a[i];
c[i].second = i;
}
sort(c.begin(), c.end());
int j= 0;
for (int i= 0; i < n; i++)
{
while(b[i] > c[j].first)
{
res = min(res, i + c[j].second);
if (j < n-1)
j++;
else
break;
}
}
cout << res << endl;
}