算法练习 DAY2 977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵

1、977.有序数组的平方

package DAY1_DAY2_array;
/**
 * 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
 * 示例 1: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]
 * 示例 2: 输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]
 */

/**
 * 977.有序数组的平方
 * 总体思路 数组还是有序数组,按照升序排列,按照暴力算法就是求平方然后再排序
 * 但是这种数组有规律可循
 * 由于是平方,负数平方后有可能比正数大(如果所有数是正数那这题就没有意义了)
 * 所以平方后的数组最大值只会出现在两端
 * 从两端遍历数组,考虑使用双指针
 */
public class DAY2_977 {
    public static void main(String[] args) {
        int[] nums = {-4,-1,0,3,10};
        int[] ints = sortedSquares(nums);
        for (int anInt : ints) {
            System.out.println(anInt);
        }
    }

    /**
     *碰到相等的情况,完全可以放左边的或者右边的,剩余一方再放回去比较即可
     */
    public static int[] sortedSquares(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        int i = nums.length - 1;
        int[] temp = new int[nums.length];
        while (left <= right){
            if(Math.pow(nums[left],2) > Math.pow(nums[right],2)){
                temp[i--] = (int)Math.pow(nums[left],2);
                left++;
            }else{
                temp[i--] = (int)Math.pow(nums[right],2);
                right--;
            }
        }
        return temp;
    }
    /**
     * 关于自增自减
     * int i = 1;
     * i = i++;
     * System.out.println(i); //1
     *
     *  * 1)我们先把后面的i(i++中的i)装进空间: temp = i;
     *  * 2)在单独对后面的i进行++操作: i = i + 1;
     *  * 3)我们在把空间中的值给前面的i: i = temp;
     *  * 操作完后i的值为1,不是2
     *
     *  前++
     * int j=1;
     * j = ++j;
     * System.out.println(j); //2
     *  * 1)我们单独先对后面的j进行++操作: j = j + 1;
     *  * 2)在把后面的j装进空间内: temp = j;
     *  * 3)在把空间中的值给前面的j: j = temp;
     *  * 操作完后j的值为2,而不是1.
     */

    /**
     *自己写的 分了 < > + 三种情况去写 其实完全可以只分两种 代码会更简洁
     *另外 temp数组按照题意应该是升序而不是降序 这就要注意存放数据到temp的时候要反过来放
     */
    /*public static int[] sortedSquares(int[] nums) {
        int[] temp = new int[nums.length]; //先创建和nums长度相等的数组空间
        int left = 0;
        int right = nums.length - 1;
        int i = 0;
        while (left<=right){
            if(Math.pow(nums[left],2) > Math.pow(nums[right],2)){
                temp[i] = (int)Math.pow(nums[left],2);
                left ++;
            }else if(Math.pow(nums[left],2) < Math.pow(nums[right],2)){
                temp[i] = (int)Math.pow(nums[right],2);
                right --;
            }else if(Math.pow(nums[left],2) == Math.pow(nums[right],2)){
                temp[i] = (int)Math.pow(nums[right],2);
                if(i<temp.length-1)i++;//这一步会添加两次 但不排除左右其实指的是最后一个同一个数 注意数组溢出问题!
                temp[i] = (int)Math.pow(nums[left],2);
                left ++;right --;
            }
            i++;
        }
        return temp;
    }*/
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值