10.22算法
1.4.长度最小的子数组
滑动窗口。定义i,j作为左右窗口。若第一次满足sum值大于等于我们的目标值,则用sublength返回当前窗口的长度。然后左窗口收缩,再次判断是否大于等于目标值。满足就再次收缩。(sum-=nums[i++])
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int i=0,j=0;//滑动窗口的前沿和后沿
int sum=0,sublength;//sublength为当前找到满足条件的窗口长度
int result=INT32_MAX;
for(j;j<nums.size();j++){
sum+=nums[j];//右窗口往后
while(sum>=target){
sublength=j-i+1;
result=result<sublength?result:sublength;
sum-=nums[i++];//左窗口往后
}
}
return result==INT32_MAX?0:result;
}
};
1.5.螺旋矩阵Ⅱ
定义好需要的变量,始终保持拐角处作为新的横纵数组。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int loop=n/2;//螺旋的次数。例如n=3时,螺旋1次就可以
int startx=0,starty=0;//起始的坐标位置
int middle=n/2;//螺旋的最中心位置。对于奇数的矩阵,最中心位置需要单独赋值
vector<vector<int>> res=vector(n,vector<int>(n,0));//创建二维数组,数据为0
int count=1,sublength=1;//count为填补的数字,sublength为遍历的数组长度
while(loop--){
int i=startx,j=starty;
//从左至右
for(j=starty;j<n-sublength;j++)
res[startx][j]=count++;
//从上至下
for(i=startx;i<n-sublength;i++)
res[i][j]=count++;
//从右至左
for(;j>starty;j--)
res[i][j]=count++;
//从下至上
for(;i>startx;i--)
res[i][j]=count++;
startx++;
starty++;
sublength+=1;
}
if(n%2!=0)
res[middle][middle]=count;
return res;
}
};
2.1移除链表元素
//注意c++链表的格式
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* vrhead=new ListNode(0);
ListNode* q;
vrhead->next=head;
ListNode* p=vrhead;
while(p->next != NULL){
if(p->next->val==val){
q=p->next;
p->next=q->next;
delete q;
}
else
p=p->next;
}
head=vrhead->next;
delete vrhead;
return head;
}
};
2.2设计链表
class MyLinkedList {
public:
struct LinkedNode{
int val;
LinkedNode* next;
LinkedNode(int val):val(val),next(nullptr){}
};
MyLinkedList() {
_dummyhead = new LinkedNode(0);
_size=0;
}
int get(int index) {
LinkedNode* p=_dummyhead->next;
if(index>(_size-1)||index<0)
return -1;
while(index--){
p=p->next;
}
return p->val;
}
void addAtHead(int val) {
LinkedNode* newNode = new LinkedNode(val);
newNode->next=_dummyhead->next;
_dummyhead->next = newNode;
_size++;
}
void addAtTail(int val) {
LinkedNode* p=_dummyhead->next;
LinkedNode* NewNode = new LinkedNode(val);
while(p->next!=nullptr)
p=p->next;
p->next = NewNode;
_size++;
}
void addAtIndex(int index, int val) {
LinkedNode* p=_dummyhead;
LinkedNode* NewNode = new LinkedNode(0);
NewNode->val = val;
if(index>_size)
return;
f(index<0)
return 0;
while(index--)
p=p-next;
NewNode->next = p->next;
p-next = NewNode;
_size++;
}
void deleteAtIndex(int index) {
LinkedNode* p=_dummyhead;
LinkedNode* q;
if(index<0||index>(_size-1))
return;
while(index--)
p=p-next;
q=p->next;
delete q;
q=nullptr;
_size--;
}
void printLinkedList() {
LinkedNode* cur = _dummyHead;
while (cur->next != nullptr) {
cout << cur->next->val << " ";
cur = cur->next;
}
cout << endl;
}
private:
int _size;
LinkedNode* _dummyHead;
};

浙公网安备 33010602011771号