2021-06-09

刷题第七天
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;
	}
};
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值