Day2-977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

977.有序数组的平方

思考过程:

题目说非递减顺序,意思是递增但是可能有相同的数。

题目要求包括两个部分:1.计算平方,覆盖之前的内容,2.排序。

要完成计算平方很简单,一个for循环就可以。

排序用两个for循环?昨天的两个for转变为一个for是将原先的内容直接覆盖,今天的是不是用一个中间值,多一步对比也能实现?

读第二遍题目发现:既然是按照非递减排列的,那么如果前端值是负数,一定比下一个数大,也就是说,找到绝对值的最小值,先给他们排个序再平方。

emmmm也需要排序,这样复杂度好像没变化。

先写一写吧

写着写着发现排序并不需要2个for,只需要交换相邻数就好

好了不行,这样不能保证前面的数排序正确,好家伙,我连最简单的冒泡都忘了吗?

看代码随想录

原来C++有专门的排序函数....

这个双指针的方法好巧妙!!我最开始刚还想过双指针,但是没有运用的特别灵活

理清这个思路之后其实问题关键点还是在边界上

第一版,样例AC,但是中间测试数据出现执行出错,说明边界存在问题

class Solution {

public:

    vector sortedSquares(vector& nums) {

        int lens = nums.size();

        vector result(lens, 0);

        int left = 0, right = lens - 1;

        while(left < right){

            if(abs(nums[left]) > abs(nums[right])){

                result[lens-1] = nums[left] * nums[left];

                left = left + 1;

                lens--;

            }

            else if(abs(nums[left]) < abs(nums[right])){

                result[lens-1] = nums[right] * nums[right];

                right = right - 1;

                lens--;

            }

            else{

                result[lens-1] = nums[left] * nums[left];

                lens--;

                result[lens-1] = nums[right] * nums[right];

                lens--;

            }

        }

        result[0] = nums[right] * nums[right];


        return result;

    }

};

第二版,所有测试用例都AC了,不如代码随想录简单,等二刷自增自减使用更熟练再改改

class Solution {

public:

    vector sortedSquares(vector& nums) {

        int lens = nums.size();

        vector result(lens, 0);

        int left = 0, right = lens - 1;

        while(left <= right){

            if(abs(nums[left]) > abs(nums[right])){

                result[lens-1] = nums[left] * nums[left];

                left = left + 1;

                lens--;

            }

            else {

                result[lens-1] = nums[right] * nums[right];

                right = right - 1;

                lens--;

            }

        }

        return result;

    }

};

209.长度最小的子数组

思考过程:

递归肯定是可以实现的。思考一下简单方法。

要想长度最小,就要找到数组里面的最大值,再向左向右双指针分别计算,最终得到最小数,写一下。

写的中间遇到问题:

1.如果说两边不一样长,如何检测到right到头了,但是left还可以继续加呢??

2.如果是横跨最大值的一个数组呢?

这个思路行不通

看代码随想录

卡哥使用的滑动窗口实现的。

实验室马上关门了,我先做下一道,回去之后再详细看,明天更新~

59.螺旋矩阵II

矩阵问题首先判断有几行几列,显然结果是n行n列。

螺旋矩阵赋值最简单的是用两个for,但是肯定可以用双指针解决,嘻嘻我已经熟啦,让我试着写一下。

写着写着...对不起,我不熟....思考很简单,但是真正写代码判断限制条件的时候还是会出问题

看代码随想录

明天更明天更,要回宿舍了

总结

1.对双指针的使用不够灵活

2.

你可能感兴趣的:(Day2-977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II)