977.有序数组的平方
思考过程:
题目说非递减顺序,意思是递增但是可能有相同的数。
题目要求包括两个部分:1.计算平方,覆盖之前的内容,2.排序。
要完成计算平方很简单,一个for循环就可以。
排序用两个for循环?昨天的两个for转变为一个for是将原先的内容直接覆盖,今天的是不是用一个中间值,多一步对比也能实现?
读第二遍题目发现:既然是按照非递减排列的,那么如果前端值是负数,一定比下一个数大,也就是说,找到绝对值的最小值,先给他们排个序再平方。
emmmm也需要排序,这样复杂度好像没变化。
先写一写吧
写着写着发现排序并不需要2个for,只需要交换相邻数就好
好了不行,这样不能保证前面的数排序正确,好家伙,我连最简单的冒泡都忘了吗?
看代码随想录
原来C++有专门的排序函数....
这个双指针的方法好巧妙!!我最开始刚还想过双指针,但是没有运用的特别灵活
理清这个思路之后其实问题关键点还是在边界上
第一版,样例AC,但是中间测试数据出现执行出错,说明边界存在问题
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int lens = nums.size();
vector<int> 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<int> sortedSquares(vector<int>& nums) {
int lens = nums.size();
vector<int> 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.