本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1 977. 有序数组的平方
1.1 题目
1.2 题解
1.2.1 方法一:内置快速排序
class Solution {
public int[] sortedSquares(int[] nums) {
for (int i = 0; i < nums.length; i++) {
nums[i] = (int) Math.pow(nums[i], 2);
}
Arrays.sort(nums);
return nums;
}
}
1.2.2 方法二:手写归并排序
class Solution {
public int[] sortedSquares(int[] nums) {
int[] res = new int[nums.length];
int i;
for (i = 0; i < nums.length; i++) {
if (nums[i] >= 0)
break;
}
int m = i;
int n = i - 1;
if (n < 0) {
for (i = 0; i < nums.length; i++) {
res[i] = (int) Math.pow(nums[i], 2);
}
return res;
} else {
for (i = 0; i < nums.length; i++) {
nums[i] = (int) Math.pow(nums[i], 2);
}
int k = 0;
while (n >= 0 && m <= nums.length - 1) {
if (nums[n] < nums[m]) {
res[k++] = nums[n];
n--;
} else {
res[k++] = nums[m];
m++;
}
}
if (n < 0 && m > nums.length - 1) {
return res;
}
if (n < 0) {
while (m < nums.length)
res[k++] = nums[m++];
}
if (m > nums.length - 1) {
while (n > -1)
res[k++] = nums[n--];
}
}
return res;
}
}
注:归并排序的思想,合并两个有序的数组,期间采取双指针。
2 189. 轮转数组
2.1 题目
2.2 题解
2.2.1 方法一:辅助数组
public static void rotate(int[] nums, int k) {
// 处理k值,如果k值大于数组长度说明存在循环
k %= nums.length;
int[] res = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
res[(i + k) % nums.length] = nums[i];
}
System.arraycopy(res, 0, nums, 0, nums.length);
}
2.2.2 方法二:数组反转
public static void rotate(int[] nums, int k) {
k %= nums.length;
reverse(nums, 0, nums.length - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.length - 1);
}
public static void reverse(int[] nums, int start, int end) {
while (start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
3 总结
3.1 归并排序模板
详见此文。