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;
}
};