第二天|LeetCode977有序数组的平方 、LeetCode209长度最小的子数组、LeetCode59螺旋矩阵II

1.题目链接:977有序数组的平方

题目描述:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

  • 解法:

       ① 暴力求解:我自己在做的时候,直接将新数组先得到,再用冒泡排序法进行排序。复习了一下冒泡排序———当有n个元素要进行排序的时候,要排n-1次;每次排完将有一个元素下次不再参与比较;故一层循环为(i;i < n-1;i++)即n-1次次,一层循环为(j ; j < n-1-i ; j++)。但其效率太低,更适用于完全无须的非递减数组,返回每个数字的平方组成新数组要求也按非递减顺序。

       ②双指针法:即左指针 i 指向初始位置,右指针 j 指向数组末尾,再加个 k 来表示新数组的索引。

           当nums[i]*nums[i] > nums[j]*nums[j],result[k] = nums[i]*nums[i],k--;

           当nums[i]*num[i] <= nums[j]*nums[j],result[k] = nums[j]*nums[j],k--;

如下两图分别为暴力解法和双指针解法:

Note:

        ①在暴力解法中使用冒泡排序的时候要注意,可能出现索引越界的问题,故要注意循环条件,第一层为nums.length-1,第二层为nums.length-1-i。

        ②在双指针解法的使用时,要注意循环条件为left<=right,因为两指针分别从两端移动,当移动到同一个位置的时候,也会指向一个值,若没有=则相当于少了一个元素值。

        ③在写程序时要注意变量声明,要注意加;要注意循环条件。

2.题目链接:209长度最小的子数组 

题目描述:

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

解法:

              ①暴力解法:用两个for循环,第一个为序列初始位置,第二个为序列终止位置,当满足条件即序列和>=target的时候,更新结果的序列长度(用一个最大值和j-i+1进行比较,哪个小取哪个),然后break跳出循环(因为我们要求的是最小的序列长度,故跳出),注意,每进行一次完整循环后,sum的值要置0,同时第二层的for循环的起始位置应该和初始第一层的一样。其最终就是将以每一个元素为起始位置的序列都遍历一次并求出每次的最小序列长度,然后最后得到result

              ②双指针解法:一层循环完成,即用终止位置作为循环条件,当满足条件的时候,更新序列长度,同时更新sum=sum-nums[left],left++即左指针右移。此时要注意的是,满足条件时要用while(sum >= target),因为此时我们要持续的更新以right为终点的序列长度,故要用while。最终这个解法就像一个模块在整个数组中滑行最终得到符合要求的最短序列长度。

下图为两种解法的代码(iava):

 

Note:

           ①暴力解法要注意,每次完整循环后要更新sum值;结束第二层循环的时候要break。

           ②双指针解法要注意,以终点指针作循环,满足条件的时候用while循环,因为要持续更新序列。

           ③最后返回的时候要比较设定好的最大值是否发生改变,若未发生改变就返回0即该数组中没有序列加一起>=target,若发生改变就返回result。 

3.题目链接:59螺旋矩阵II

题目描述:给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

解法:

              ①首先想到的是我们要进行数组遍历并进行赋值,故遍历条件是什么?可以画图理解当输入n时,要进行n/2次螺旋遍历,故循环条件即为loop < n/2

              ②设定初始遍历位置startx,starty;应用循环不变量,即每次遍历的条件都相同,这里我们用左闭右开;设定offset,因为每完成一螺旋遍历的时候整个矩阵会向内缩小一圈,故offset++;设定count用于赋值;设定loop作为循环变量

              ③当n为奇数的时候,进行完完整的螺旋遍历后会剩下最后一个值,此时我们只需将该处的值赋值即可,即reslut[startx][starty] = count++。

              ④当进行完一次循环的时候即从左--->右,从右-->下,从下-->左,从左-->上后,loop++,offset++,startx++,starty++;并且startx,starty,loop的初始值设为0,offset的初始值设为1。

              ⑤最后返回数组

下面为代码(java):

 

Note:

               ①学到了可以这样写循环for(;j > loop;j++)。

               ②要注意后两次的循环遍历的条件。

               ③要注意各种变量的++。

               ④当n为奇数的时候,螺旋遍历完后会剩一个值,要进行填充。

               ⑤要注意offset的值,在每次螺旋遍历后都要+1,因为每进行完一次循环后,整个螺旋会向内缩小一格。

               ⑥要注意初始化变量的时候,各种变量的值为0还是1。

4.总结:

                   ①三个题中都贯彻了双指针的解法,我对于双指针的解法还是不是很熟悉。

                   ②从977中学到了对向双指针的解法,指针从两端向中间移动。

                   ③从209中学到了一个是暴力解法(虽然也使用双指针),但其用两层for循环,分别代表起始指针和终止指针的位置,其为先确定起始位置再确定终止位置;其遍历的次数更多。

     另一个也是双指针解法,但其用终止指针作为循环,仅用一层循环,先确定了终止位置再去改变初始的位置的值,相当于一个上下两个长度不完全相同的滑块叠在一起在整个数组中进行滑动。

                   ④在手撕代码的时候要注意,变量名要前后写一致,不要忘写;,注意循环条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值