LeetCode——977.有序数组的平方

力扣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;
    }
}

今天看到一个大佬写的文章,“知识学会了,终身都是自己的;没有学会的知识,只是身外之物。”

菜菜共勉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值