LeetCode每日2道--有序数组的平方

84 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天,点击查看活动详情

前言

算法的重要性不言而喻!大厂都在考算法,说明算法不好学,区分度高!

如果我们认为我不进大厂我就不用学算法了,我学学框架,学学能用好不就行了。但是你要知道你的竞争者有多少,你怎么才能跟别人拉开差距???不就是需要基础好,能培养吗?

现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,补基础。

说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!

选题、动图来自于:www.programmercarl.com/

u=3146425397,2207907800&fm=26&gp=0.jpg

有序数组的平方

image.png

双指针法

思路分析: 因为数组是有序的嘛,所以呢这个最大值和最小值一定是在前面后后面不,所以我们只需要定义两个指针就可以了,一个指向最前面,一个指向最后面

之后将两个指针指向的值进行平方,然后比较它们的大小,依次放入新的数组里即可!

这个新数组也有讲究呢,题目要求说,新数组中的值应该是从小到大的,所以我们将新数组的指针指向最后进行从大到小赋值即可!

这里其实还是要多去进行debug

/**
 * 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
 *
 * @Date 2021/12/18 9:19
 * @Version 1.0
 */
public class SquaringAnOrderedArray {
​
    public static void main(String[] args) {
        int[] nums = {-4, -2, 0, 1, 2, 3};
        SquaringAnOrderedArray soa = new SquaringAnOrderedArray();
        int[] ints = soa.sortedSquares(nums);
        int[] ints1 = soa.sortArray(nums);
        for (int anInt : ints1) {
            System.out.println(anInt);
        }
​
    }
​
​
    /**
     *
     * @param nums
     * @return
     */
    public int[] sortedSquares(int[] nums) {
        //注意这两个都是数组坐标,一个在最前面,一个在最后面
        int left = 0;
        int right = nums.length - 1;
​
        //在定义一个放结果的数组,和指向新数组最后一个元素的索引
        int[] result = new int[nums.length];
        int index = nums.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;
    }
}