int[] cache = newint[n]; for (int i = 0; i < n; i++) { cache[row[i]]=i; }
具体流程如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
for (int i = 0; i < n - 1; i+=2) { // b 为 a 的情侣 int a = row[i], b=a^1; // 当 a 的右边不是 b 时 if (row[i+1]!=b){ // 将 b 的位置换到 a 的右边 int src = i+1, target = cache[b]; // 更新 cache cache[row[target]] = src; cache[row[src]] = target; // 交换位置 swap(row,src,target); // 记录操作次数 ans++; } }
publicintminSwapsCouples(int[] row){ int n = row.length; int ans = 0; int[] cache = newint[n]; for (int i = 0; i < n; i++) { cache[row[i]]=i; } for (int i = 0; i < n - 1; i+=2) { int a = row[i], b=a^1; if (row[i+1]!=b){ int src = i+1, target = cache[b]; cache[row[target]] = src; cache[row[src]] = target; swap(row,src,target); ans++; } } return ans; }
publicvoidswap(int[] nums, int a, int b){ int c = nums[a]; nums[a] = nums[b]; nums[b] = c; }