面试题复习(0902-0909)

1. 完全背包问题

和01背包唯一的区别是,每件物品都有无限个(也就是可以放入背包多次)

代码和01唯一的区别在于j的循环是从小到大,不是从大到小。ij谁在外谁在内层区别不大。

#include <bits/stdc++.h>
using namespace std;

int main(){
    int N,V;
    cin>>N>>V;
    vector<int> values(N), weights(N);
    for(int i =0;i<N;i++){
        cin>>weights[i]>>values[i];
    }
    vector<int> dp(V+1);
   for(int j=0;j<=V;j++ ){
    for(int i =0;i<N;i++)
        {
            if(j-weights[i]>=0)
            dp[j] = max(dp[j], dp[j-weights[i]]+values[i]);
        }
    }
    cout<<dp[V]<<endl;
    return 0;
}

2. 零钱兑换二

    int change(int amount, vector<int>& coins) {
        vector<int> dp(amount+1,0);
        dp[0] = 1; // 当总金额为0时,有一种组合方法就是0
        int n = coins.size();
        for(int i=0;i<n;i++){
            for(int j =coins[i];j<=amount;j++){
                dp[j] += dp[j-coins[i]];
            }
        }
        for(int i = 0;i<amount+1;i++){
            cout<<dp[i]<<endl;
        }
        return dp[amount];
    }
};

组合数:要进行初始化,并且知道每一种组合等于把所有硬币遍历后的上一种组合加起来。(不用再加一)

时间复杂度:amount*coins的数量

j从coins[i]开始!其实从0开始也行,但是就要加个判断j大于coins[i]才能做呀,不然就是负数了

注意i,j的遍历顺序与求排列数还是组合数有关:

如果求组合数就是外层for循环遍历物品,内层for遍历背包

如果求排列数就是外层for遍历背包,内层for循环遍历物品

3. 零钱兑换

与上一题的区别在于dp不是表示组合数个数,而是表示凑足总额为j所需钱币的最少个数为

就是从+= 变成了min?

这里就要+1了,因为每次遍历多加了一个硬币,值就要+1

    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount+1,INT_MAX);
        dp[0] = 0; // 当总金额为0时,有一种组合方法就是0
        int n = coins.size();
        for(int i=0;i<n;i++){
            for(int j =coins[i];j<=amount;j++){
                if(dp[j-coins[i]] != INT_MAX)
                    dp[j] =min(dp[j], dp[j-coins[i]]+1);
            }
        }
        if(dp[amount] == INT_MAX) return -1;
        return dp[amount];
    }

4. TOPK数的快排做法

注意这个topk指的是从大到小排序后的第k个!所以实际上并不是真正的想象中从小到大排序后的第k个!可以直接转换成第n-k+1大的数就行

    int quick_sort(vector<int>& nums,int left, int right,int k){
        if(left >= right) return nums[left];
        int i = left-1, j = right+1;
        int mid = (left+right)/2;
        int x = nums[mid];
        while(i <j){
            do i++; while(nums[i] < x);
            do j--; while(nums[j] > x);
            if(i<j) swap(nums[i],nums[j]);
        }
        if(j-left+1 >= k) return quick_sort(nums,left,j,k);
        else return quick_sort(nums,j+1,right,k-(j-left+1));
    }
    int findKthLargest(vector<int>& nums, int k) {
        int res =  quick_sort(nums,0,nums.size()-1, nums.size()-k+1);
        return res;
    }

代码和快排差不多,但是要想明白,每次是找哪边继续索引。如果排完序后的长度比k大,说明k在左边,就往左边回溯,如果比k小,就回溯右边,注意回溯右边的时候就不是找第k大了,而是k减去左边区间的长度

为什么时间复杂度是On啊??

还是没懂,反正就是n,快速排序的复杂度是nlogn

4. SVM的核函数和高阶是具体如何实现的?

其中,线性核适合线性可分的数据,多项式核适合非线性模型,高斯核适合那种不清楚数据分布的非线性情况。

映射到高维空间不是说把每个样本做映射,而是在计算距离的时候,用高斯核计算两个x之间的距离。

5. GBDT树

梯度提升决策树。

树的流程从 决策树-》随机森林-》梯度提升决策树->Xgboost, 随机森林是bagging,GBDT和xgb都是boosting。

梯度提升是一种集成学习的一种方法,决策树是基学习器。为啥要这两个结合呢,是因为决策树是if,else的,速度快,适合非线性关系,不需要对输入数据做标准化,特征工程少,也可以处理特征缺失的情况。决策树能自动组合多个特征。

但是,决策树的缺点就是过拟合。抑制单颗树的复杂程度,再通过梯度提升方法继承多个决策树,就能达到平衡。

抑制复杂度的方法有:(1)树的最大深度(2)限制叶子结点的最少样本数量,有的特征缺失太多了就不放了(3)限制节点分裂时的最少样本数量(4)对训练样本采样,单个决策树学习时只使用一部分训练样本,这是bagging的思想(5)随机森林的思想,学习单颗决策树时只使用一部分特征(6)在目标函数中添加正则项惩罚

使用最小化损失函数(如均方误差或对数损失)来优化模型性能。每个弱学习器的训练都是在前一轮模型的残差(即预测值与真实值之间的差)基础上进行的。

具体优化方式: 前向分布算法

GBDT 算法可以看成是由 K 棵树组成的加法模型:

使用前向分布算法,每一步只学习一个基学习器,逐步逼近优化目标函数。

在第t步的目标函数为:

注意!每一颗树只拟合上一棵树的结果与目标之间的残差,不是去拟合目标

6. 数组中有个数的数量超过一半,如何最快找出这个数?

这是一种抵消的思路,就是如果两个数不同就会抵消为0,如果这个数超过了一半,说明它与其他数不同的时候被抵消完了以后,数量还是会>0,这样On就找出来了

或者是排序求中间值,这么看似乎是可以用快速选择的?只要找到一个数,刚好在中间位置,说明他就是众数。

还有一种方法,就是利用哈希map。

7. 每日温度

好难好难好难。。实际上是一种栈的方法,如果这个数比上一个数小就压栈,大就可以取出栈中的元素,并计算坐标之差

只要大,就把小的都取出来。我这里用了两个栈,分别存索引和值,实际上只存索引就行,值从数组里取。

    vector<int> dailyTemperatures(vector<int>& temperatures) {
        stack<int> idxs, values;
        int cur=0;
        vector<int> res(temperatures.size(),0);
        for(int i = 0;i<temperatures.size();i++){
            while (!idxs.empty() && values.top() < temperatures[i]){
                res[idxs.top()] = i-idxs.top();
                values.pop();
                idxs.pop();
            }
            idxs.push(i);
            values.push(temperatures[i]);

        }
        return res;
    }

8. 二叉树展开为链表

就是判断一下,没啥好说的 

    TreeNode * findr(TreeNode * cur){
        while(cur->right != nullptr){
            cur =  cur->right;
        }
        return cur;
    }
    void flatten(TreeNode* root) {
        TreeNode * cur = root;
        while(cur!= nullptr){
            if(cur->left != nullptr){
                TreeNode * r = cur->right;
                cur->right = cur->left;
                TreeNode * nextr = findr(cur);
                nextr->right = r;
                cur->left = nullptr;
            }
            cur = cur->right;
        }
        return ;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/874321.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国产化数据库挑战及发展趋势

非国产数据库如Oracle、MySQL和MSSQL等在某些领域占据重要地位&#xff0c;但国产数据库的市场份额正在逐步提升&#xff0c;特别是在政策支持和市场需求的双重推动下&#xff0c;国产数据库的替代进程正在加速。 一、国产数据库市场规模 2024年中国数据库市场规模预计为543.1亿…

【树和二叉树的相关定义】概念

1.回顾与概览 2.什么是树型结构 3.树的&#xff08;递归&#xff09;定义与基本术语 3.1树的定义 注意&#xff1a;除了根结点以外&#xff0c;任何一个结点都有且仅有一个前驱 3.2树的其他表示方式 3.3树的基本术语 结点&#xff1a;数据元素以及指向子树的分支根结点:非空…

AI基础 L16 Logic Agents I

What is an Agent? • The main point about agents is they are autonomous: capable of acting independently, exhibiting control over their internal state • Thus: an agent is a computer system capable of autonomous action in some environment in order to mee…

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端&#xff0c;一般来说需要版本检测和自动更新功能&#xff0c;这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤&#xff1a; 读取本地应用版本拉取远程版本并比较两个版本如果需要升级&…

手机TF卡格式化后数据恢复:方法、挑战与预防措施

在现代生活中&#xff0c;‌手机已经成为我们不可或缺的一部分&#xff0c;‌而TF卡&#xff08;‌即MicroSD卡&#xff09;‌作为手机存储的扩展&#xff0c;‌更是承载了我们大量的重要数据。‌然而&#xff0c;‌不慎的格式化操作往往导致数据丢失&#xff0c;‌给用户带来不…

【重学 MySQL】五、MySQL 的卸载

【重学 MySQL】五、MySQL 的卸载 停止MySQL服务卸载MySQL程序删除残余文件清理注册表删除环境变量配置重启电脑 MySQL的卸载过程需要仔细操作&#xff0c;以确保彻底卸载并清理所有相关文件和配置。 停止MySQL服务 打开任务管理器&#xff1a;右键点击任务栏空白处&#xff0…

C++笔记---list

1. list的介绍 list其实就是就是我们所熟知的链表&#xff08;双向循环带头结点&#xff09;&#xff0c;但其是作为STL中的一个类模板而存在。 也就是说&#xff0c;list是可以用来存储任意类型数据的顺序表&#xff0c;既可以是内置类型&#xff0c;也可以是自定义类型&…

单词排序C++实现

代码如下&#xff1a; #include<iostream> #include<string> #include<fstream> #include<map> #include<iomanip> #include<algorithm> #include<vector>int read_file(std::map<std::string,int> &map_words) {std::st…

大牛直播SDK最经典的一句

搜索引擎搜大牛直播SDK&#xff0c;居然提示我搜“大牛直播SDK最经典的一句”&#xff0c;闲来无事&#xff0c;点开看看&#xff0c;AI智能问答&#xff0c;给出了答案&#xff1a; ‌大牛直播SDK最经典的一句是&#xff1a;"我们只做最擅长的部分,我们不做的,提供对接接…

[进阶]面向对象之多态(二)

文章目录 多态调用成员的特点多态的优势和弊端 多态调用成员的特点 变量调用:编译看左边,运行也看左边方法调用:编译看左边,运行看右边 多态的优势和弊端 优势&#xff1a; 在多态形式下&#xff0c;右边对象可以实现解耦合&#xff0c;便于扩展和维护定义方法的时候&…

mysql高级sql

文章目录 一&#xff0c;查询1.按关键字排序1.1按关键字排序操作(1)按分数排序查询&#xff08;不加asc默认为升序&#xff09;(2)按分数降序查询&#xff08;DESC&#xff09;(3)使用where进行条件查询(4)使用ORDER BY语句对多个字段排序 1.2使用区间判断查询&#xff08;and/…

ESP32 TCP通信交换数据Mixly Arduino编程

TCP通信交换数据 在ESP32与ESP32或其它局域网络内主机间传输数据时&#xff0c;TCP是很方便的&#xff0c;特别当我们连接互联网后ESPnow不能用&#xff0c;MQTT又不稳定发送大量的数据&#xff0c;同时蓝牙有其它用途时&#xff0c;那么学会TCP通信协议就变得十分重要。 一、…

【开源分享】vsomeip 安装、编译、运行步骤笔记

文章目录 1. 摘要2. 安装、编译2.1 开发环境说明2.2 安装依赖2.3 获取代码2.4 编译代码2.5 安装 3. 测试验证参考 1. 摘要 本文主要描述 vsomeip 的安装、编译与运行步骤。下载源码&#xff0c;安装必要依赖&#xff0c;如Boost和CMake。通过CMake配置编译 vsomeip 库&#xf…

2024年10款好用的图纸加密软件推荐|企业图纸的守护神

在数字化时代&#xff0c;图纸数据的安全性是企业不可忽视的重要任务。随着技术的不断进步&#xff0c;图纸加密软件成为了保护企业知识产权和敏感数据的关键工具。以下是2024年推荐的10款好用的图纸加密软件&#xff0c;它们各具特色&#xff0c;能够满足不同企业的需求。 1.…

Java数组的定义及遍历

数组的声明 长度不能超过定义的长度。超过则会报错通过下标来访问 数组的遍历 最常用最简单的方法是增强for循环。

【解决bug之路】npm install node-sass(^4.14.1)连环报错解决!!!(Windows)

有关node-sass的深入分析可参考&#xff1a;又报gyp ERR&#xff01;为什么有那么多人被node-sass 坑过&#xff1f; 主要有如下三方面错误&#xff0c;请自查&#xff1a; 1.node&#xff0c;npm版本需与node-sass版本匹配&#xff0c;像node-sass&#xff08;^4.14.1&#x…

第三部分:4---进程地址空间

目录 数组的空间分配解析&#xff1a; 物理地址和虚拟地址&#xff1a; 虚拟地址空间&#xff1a; 进程地址空间的本质&#xff1a; 为什么要有进程地址空间&#xff1f; 页表对进程访问内存的检查&#xff1a; 进程地址空间和页表如何关联起来&#xff1f; 进程的独立…

保姆级离线+windows环境+私有化部署大模型

基于gis数据的高敏感高保密性要求&#xff0c;相信gis的小伙伴都有如下的需求&#xff1a;在内网&#xff0c;无外网环境下&#xff0c;部署自己的私有化大模型。 1.环境背景&#xff1a; 没有Linux环境&#xff0c;只是windows 无外网&#xff0c;内网环境 2.安装部署过程…

数据结构与算法1: 链表

基础知识 链表可以被想象为一系列的节点&#xff0c;每个节点至少有一个指针指向下一个节点&#xff0c;在最后一个节点&#xff0c;用null pointer来表示链表的结束。 链表的创建速度通常很快&#xff0c;在表头和表尾的插入也很快&#xff08;O(1)&#xff09;&#xff0c;…

HCIA--实验十三:VLAN间通信子接口实验/双单臂路由实验

一、实验内容 1.需求/要求&#xff1a; 将两个单臂路由通过两台交换机连接起来&#xff0c;成为双臂路由&#xff0c;并探讨这么做的原因。实现全网通&#xff0c;让任何一台主机之间都可以通信。 二、实验过程 1.拓扑图&#xff1a; 2.步骤&#xff1a; 1.给PC配置ip地址…