请解释这段代码,public static int minSwaps(int[] nums) { int n = nums.length; int start = 0, end = n - 1; int swaps = 0; while (start < end) { // 如果当前位置不是应该有的数字,就一直交换直到位置对了 while (nums[start] == start + 1 && start < end) { start++; } if (start == end) { break; } int temp = nums[start]; nums[start] = nums[temp - 1]; nums[temp - 1] = temp; swaps++; // 如果当前位置不是应该有的数字,就一直交换直到位置对了 while (nums[end] == end + 1 && start < end) { end--; } if (start == end) { break; } temp = nums[end]; nums[end] = nums[temp - 1]; nums[temp - 1] = temp; swaps++; } return swaps; }
时间: 2024-03-04 11:49:49 浏览: 49
这段代码实现了计算将给定数组变成半有序排列所需的最小操作次数的功能。以下是代码的详细解释:
1. `int n = nums.length;` 计算给定数组的长度。
2. `int start = 0, end = n - 1; int swaps = 0;` 初始化需要被交换的数字的位置为数组的两端,交换次数为 0。
3. `while (start < end) { ... }` 循环,直到数组变成半有序排列。
4. `while (nums[start] == start + 1 && start < end) { start++; }` 如果当前位置不是应该有的数字,就一直交换直到位置对了。这里的目标是将第 start 个位置上的数字变成 start + 1,如果当前位置上的数字已经是应该有的数字,就将 start 加 1,继续检查下一个位置。
5. `if (start == end) { break; }` 如果 start 和 end 指向同一个位置,也就是数组已经变成了半有序排列,就跳出循环。
6. `int temp = nums[start]; nums[start] = nums[temp - 1]; nums[temp - 1] = temp; swaps++;` 将第 start 个位置上的数字与应该在这个位置上的数字交换,交换次数加 1。
7. `while (nums[end] == end + 1 && start < end) { end--; }` 同理,检查数组末尾的数字是否在正确的位置上,如果不是就将 end 向前移动,直到找到一个需要被交换的数字位置。
8. `if (start == end) { break; }` 如果 start 和 end 指向同一个位置,也就是数组已经变成了半有序排列,就跳出循环。
9. `temp = nums[end]; nums[end] = nums[temp - 1]; nums[temp - 1] = temp; swaps++;` 将第 end 个位置上的数字与应该在这个位置上的数字交换,交换次数加 1。
10. `return swaps;` 返回交换的次数,也就是将数组变成半有序排列所需的最小操作次数。
总体来说,这段代码的思路是不断地将数组中位置不对的数字交换到正确的位置上,直到整个数组变成半有序排列。
阅读全文