Leetcode977.有序数组的平方
问题: 同时,像二分法一样,也一定要注意边界问题,在这里花了很多时间 不能用push_back,
if(pow(nums[t1])>pow(nums[t2]))
{
if(t1>=0)
{
cout<<"push:"<<"t1="<<t1<<"nums="<<nums[t1]<<endl;
//小问题:如果vector给定了长度既vector<int> res(n,0)是不能用push_back的哦,不然数组会越来越长
res.push_back(pow(nums[t1]));
t1--;
}
}else
我的思路:
因为我发现题目都要求是:非递减数组,而平方的话从两边到中间依次减小(不完全正确)
所以想到先遍历数组,找到正负交接的地方…然后用两个指针,分别往左右(既开头/末尾)走,每走一步就对比一下两边都值然后存入数组;
这样做相比于卡老师的双指针有问题:1.边界问题比较多2.代码逻辑绕,感觉有点反常;
class Solution {
public:
//求平方函数
int pow(int k){
return k*k;
}
//打印整个vector数组
void printallres(vector<int>& r)
{
int i=0;
while(i<r.size())
{
cout<<r[i]<<" ";
i++;
}
}
vector<int> sortedSquares(vector<int>& nums) {
vector<int> res;
int t=0;
/*遍历一遍数组,找到"分界"的地方既政府*/
for(;t<nums.size()-1;t++)
{
//cout<<t<<endl;
if(nums[t]<=0&&nums[t+1]>0)
{
//这里有个陷阱,就是不能nums[t+1]>=0,因为这样在区间界定的时候可能会有歧义
if(t+1==nums.size()){
t++;
//break;
}
break;
}
}
//cout<<"t="<<t<<endl;
//t,t1是向数组的左边移动,t2是向数组右边移动
int t1=-1,t2=nums.size();
if(t==0){
t2=t;
//t1=-1;
}else if(t2==nums.size()-1){
t1=t;
//t2=-1;
}else{
t1=t;
t2=t+1;
}
cout<<"t1="<<t1<<" t2="<<t2<<endl;
while(t1>=0&&t2<nums.size())
{
//
if(pow(nums[t1])<pow(nums[t2]))
{
if(t1>=0)
{
cout<<"push:"<<"t1="<<t1<<"nums="<<nums[t1]<<endl;
res.push_back(pow(nums[t1]));
t1--;
}
}else
{
if(t2<nums.size())
{
cout<<"push:"<<"t2="<<t2<<" nums="<<nums[t2]<<endl;
res.push_back(pow(nums[t2]));
t2++;
}
}
}
cout<<"res:";
printallres(res);
/*-------------推出循环--------------*/
cout<<"--------------"<<endl;
for(;t1>=0;t1--){
res.push_back(pow(nums[t1]));
cout<<"push:"<<"t1="<<t1<<" nums="<<nums[t1]<<endl;
}
for(;t2<nums.size();t2++)
{
res.push_back(pow(nums[t2]));
cout<<"push:"<<"t2="<<t2<<" nums="<<nums[t2]<<endl;
}
cout<<"res:";
printallres(res);
return res;
}
};
感觉双指针的思路更加聪明,不别扭
双指针法
思路清晰多了,代码也简化了不少
但仍然要注意** 边界问题**
我的理解:
例子:[-4,-1,0,3,10]
两个指针分别指向头和尾,然后往中间方向走,每走一次就对比一下大小,然后将结果从数组后面插入
感悟:
今天还想到一个问题,那就是厉害的程序要学会用机器的思维去思考解决问题,要思考机器实现(不论是面向对象还是面向过程).不断的做题的目的正是如此,通过题目去了解机器解决各种问题的逻辑,
209.长度最小的子数组
开始我把问题想复杂了,题目要求
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
他让返回其长度,我以为是返回最短的"子数组";所以想复杂了;