力扣https://leetcode-cn.com/problems/squares-of-a-sorted-array/
3.25更新
第一次的思路:找到正负数的交界,指针从交界向左右两侧移动。导致代码比较复杂
较为简单的思路:从原数组的两侧开始,直接比较数组单元的平方,先找大数,为结果数组逆序赋值
class Solution {
public int[] sortedSquares(int[] nums) {
int right = nums.length - 1;
int left = 0;
int[] result = new int[nums.length];
int index = result.length - 1;
while (left <= right) {
if (nums[left] * nums[left] > nums[right] * nums[right]) {
result[index--] = nums[left] * nums[left];
++left;
} else {
result[index--] = nums[right] * nums[right];
--right;
}
}
return result;
}
}
-------------------------------------------以下为原内容--------------------------------------------------------------------
调了一天,想下班了,简单记录一下
收获:细致体会了“分析题目,概括所有可能的情况,根据不同的情况解题”的过程,Debug一整天,体会了IDE的迷人之处
拉闸:最后调出来了,分情况讨论写了太多if-else,看起来超级low,瞄了一眼大佬的解答,差之甚远,想下班了,下次看了再来分享更好的答案。
单纯记录一下,只是跑出了结果而已,基本不值得借鉴。
class Solution {
public int[] sortedSquares(int[] nums) {
int len = nums.length;
//将 0 前的部分全部变为正数,此时的数组左右两侧向中间依次递减
//数组有三种情况:1.全为负 2. 有负有正有0 3.有负有正没0 4.全为正
//有关数组遍历的循环,必须有条件nums[k] < len
int k;
int condition = 0; //标志情况
int zero = -2; //标志0的位置,数组的位置都大于0,初始化时避免直接选用初始化的值
int a = -2; //标志首次出现正数的位置
if(nums[0] > 0) {condition = 4;}
else if(nums[len - 1] < 0) {condition = 1;}
else {
for (k = 0; k < len; k++) {
if (nums[k] == 0) {
condition = 2;
zero = k;//第一次出现0的位置
break;
} else {
if(nums[k] > 0){a = k;break;}
condition = 3;
}
}
}
int[] result = new int[len];
int left; int right;
int i = len - 1;
if(condition == 1) {
//全为负,将数组翻转倒置
for (k = 0; k < len; k++) {
result[k] = -nums[i];
i--;
//System.out.println("翻转" + -nums[k]);
}
}else if(condition == 4) {
//全为正,不用管
for (k = 0; k < len; k++) {
result[k] = nums[k];
//System.out.println("直接复制" + nums[k]);
}
}else{
if(condition == 2) {
//有负有正有0,left定在0的位置,注意:起始时,left和right必须有一个是整个数组的最小值
left = zero;
right = zero + 1;
}else{
//有正有负没0,right为起始数组中第一次出现正数的位置,left向左一个,即各自为正数负数区域最小值
right = a;
left = a - 1;
}
for(int q = 0; q < len; q++) {
if (left >= 0 && right < len) {
if (-nums[left] <= nums[right]) {
result[q] = -nums[left];
left--;
//System.out.println("left >= 0 && right < len ");
//System.out.println("left= " + left + " right= " + right);
} else {
result[q] = nums[right];
right++;
//System.out.println("left >= 0 && right < len ");
//System.out.println("left= " + left + " right= " + right);
}
} else if (left >= 0 && right >= len) {
//右侧遍历完成
result[q] = -nums[left];
left--;
//System.out.println("left >= 0 && right >= len ");
//System.out.println("left= " + left + " right= " + right);
} else if (left < 0 && right < len) {
//左侧遍历完成
result[q] = nums[right];
right++;
// System.out.println("left < 0 && right < len ");
//System.out.println("left= " + left + " right= " + right);
}
}
}
//完成数组排序,再完全平方
for(i = 0; i < len; i++){
//System.out.println("i= " + result[i]);
result[i] *= result[i];
}
return result;
}
}
今天看到一个大佬写的文章,“知识学会了,终身都是自己的;没有学会的知识,只是身外之物。”
菜菜共勉。