2020/12/29刷题

209长度最小的子数组

在这里插入图片描述

解题思路:

解答1:暴力解法:两层暴力循环解决问题
时间复杂度:O(N2)

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int ret=INT_MAX;
        for(int i=0;i<nums.size();i++){
            int sum=0;
            for(int j=i;j<nums.size();j++){
                sum+=nums[j];
                if(sum>=s){
                    int tmp=j-i+1;
                    ret=min(tmp,ret);
                    break;                    
                } 
            }
        }
        return ret==INT_MAX?0:ret;
    }
};

解答2:滑动窗口法
在本题中实现滑动窗口,主要确定如下三点:

窗口内是什么? 如何移动窗口的起始位置? 如何移动窗口的结束位置? 窗口就是满足其和 ≥ s 的长度最小的 连续 子数组。

窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。

窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,窗口的起始位置设置为数组的起始位置就可以了.
时间复杂度为O(n);

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int ret=INT_MAX;
        int sum=0;
        int i=0;//起始指针
        for(int j=0;j<nums.size();j++){
            sum+=nums[j];
            while(sum>=s){
                int len=j-i+1;//滑动窗口的长度
                ret=min(len,ret);
                sum-=nums[i++];//不断变更i(子序列的起始位置)取最小直到不满足sum>=s;
            }
        }
        return ret==INT_MAX?0:ret;
    }
};

24.两两交换链表中的结点

在这里插入图片描述
解题思路:

解答1:采用递归解法,递归三部曲:

1.递归终止条件:当递归的当前结点或者下一个节点为null时,返回此节点
2.循环体内递归:定义newhead为head->next;递归调用swapPairs(newhead->next);将head->next指向递归调用之后的返回值。
3.之后将newhead->next指向head即可。

解法2:设置虚拟头节点采用迭代的思想
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        /*递归解法
        if(head==nullptr||head->next==nullptr) return head;
        ListNode *newhead=head->next;
        head->next=swapPairs(newhead->next);
        newhead->next=head;
        return newhead;*/
        //设置虚拟头节点
        ListNode *dummpy=new ListNode(0,head);
        ListNode *pre=dummpy;
        while(head&&head->next){
            ListNode *next=head->next;
            head->next=next->next;
            next->next=head;
            pre->next=next;

            pre=head;
            head=head->next;
        }
        return dummpy->next;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值