练习题目:BST查找,DP,位运算

在这里插入图片描述
代码:

#include<iostream>
#include<stack>
using namespace std;

struct Treenode{
	int value;
	Treenode *left;
	Treenode *right;
	//构造函数
	Treenode() :value(0),left(nullptr),right(nullptr){}
	Treenode(int x):value(x),left(nullptr),right(nullptr){}
	Treenode(int x,Treenode *left,Treenode *right):value(x),left(left),right(right){}
};
//二叉排序树中序遍历
int Ksmallest(Treenode *root,int k){
	stack<Treenode*> s;
	//二叉树节点和栈其中一个有效
	while(root || !s.empty()){
		if(root){
			s.push(root);
			root = root->left;
		}else{
			root = s.top();
			s.pop();
			if(--k == 0){
				return root->value;//找到,直接返回
			}
			root = root->right;
		}
	}
	return -1;
}
int main(){
	//知识点 :new A() 返回值类型是 *A
	Treenode* root =new Treenode(8);
	root->left =new Treenode(5);
    root->right = new Treenode(9);
    root->left->left = new Treenode(3);
    root->left->right = new Treenode(6);
    root->left->left->left = new Treenode(1);
	cout << Ksmallest(root, 4) << endl;
}

2.DP

在这里插入图片描述

#include <iostream>
#include <vector>

using namespace std;

int maxNumber(vector<vector<int>>& graph) {
    int n = graph.size();
    vector<vector<int>> dp(n, vector<int>(n,0));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            dp[i][j] = graph[i][j];
        }
    }
    //DP数组初始化
    dp[0][0] = graph[0][0];
    for (int i = 1; i < n; i++) {
        dp[0][i] += dp[0][i-1];
        dp[i][0] += dp[i-1][0];
    }
    for (int i = 1; i < n; i++) {
        for (int j = 1; j < n; j++) {
            dp[i][j] += max(dp[i-1][j], dp[i][j-1]);
        }
    }
    return dp[n-1][n-1];
}

int main() {
    //二维数组赋值,注意,不能直接赋值
    int dp[3][3] = { {1, 5, 1}, {1, 6, 1}, {2, 3, 1} };
	vector<vector<int>> matrix(3, vector<int>(3,0));
	for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
			matrix[i][j] = dp[i][j];
        }
    }
	cout << maxNumber(matrix) << endl;
    return 0;
}

3.找到出现一次的那个数
在这里插入图片描述
直接用异或求解

int singleNumber(vector<int>& nums) {
    int result = 0;
    for (int i : nums) {
        result ^= i;
    }
    return result;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值