刷题第七天
1、最长递增子序列
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if(nums.size() == 0) return 0;
vector<int> dp(nums.size(), 1);
for(int i = 0; i < nums.size(); i++){
for(int j = 0; j < i; j++){
if(nums[i] > nums[j])
dp[i] = max(dp[i], dp[j] + 1);
}
}
return *max_element(dp.begin(), dp.end());
}
};
2、岛屿数量
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
class Solution {
public:
void dfs(vector<vector<char>>& grid, int r, int c){
int nr = grid.size();
int nc = grid[0].size();
grid[r][c] = '0';
if(r-1>=0 && grid[r-1][c]=='1') dfs(grid, r-1, c);
if(r+1<nr && grid[r+1][c]=='1') dfs(grid, r+1, c);
if(c-1>=0 && grid[r][c-1]=='1') dfs(grid, r, c-1);
if(c+1<nc && grid[r][c+1]=='1') dfs(grid, r, c+1);
}
int numIslands(vector<vector<char>>& grid) {
int nr = grid.size();
if(!nr) return 0;
int nc = grid[0].size();
int num_islands = 0;
for(int r = 0; i < nr; i++){
for(int c = 0; c < nc; c++){
if(grid[r][c] == '1'){
nums_islands++;
dfs(grid, r, c);
}
}
}
}
return nums_islands;
};
3、最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。
class MinStack {
public:
stack<int> stack1;
stack<int> stack2;
MinStack(){
}
void push(int val) {
stack1.push(val);
if(stack2.empty() || val <= stack2.top())
stack2.push(val);
}
void pop() {
if(stack1.top() == stack2.top())
stack2.pop();
stack1.pop();
}
int top() {
return stack1.top();
}
int getMin() {
return stack2.top();
}
};
4、删除排序链表中的重复元素-2
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head == nullptr) return head;
ListNode* dummy = new ListNode(0, head);
ListNode* cur = dummy;
while(cur->next && cur->next->next){
if(cur->next->val == cur->next->next->val){
int x = cur->next->val;
while(cur->next && cur->next->val == x)
cur->next = cur->next->next;
}
else
cur = cur->next;
}
return dummy->next;
}
};