思路详解: 先用一个数组记录每个数出现的位置。 首先可以发现由于值域较小,可以考虑 1∼n1 \sim n1∼n 遍历一遍,设当前遍历到了 iii,那么考虑从大到小的遍历 (i−1)∼1(i - 1) \sim 1(i−1)∼1,如果位置之差 ≥k\ge k≥k,那么就可以交换,注意交换时的顺序。 那么为什么这样做是对的呢?第一步很容易理解,那么为什么第二步要从大到小?原因是这样做既可以保证交换数量最大化,也可以保证不会出现多对相同的 (l,r)(l, r)(l,r)。