面试题复习(0902-0909)

news2024/9/22 13:27:12

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 ;
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux(2)--VmWare虚拟机安装

文章目录 1. VmWare概念2. 安装步骤2.1 下载2.2 安装过程 3. 小结 1. VmWare概念 现在我们要学习Linux了&#xff0c;需要有一台安装Linux系统的计算机。 但是我们又不想放弃Windows&#xff0c;毕竟平时办公、娱乐还得用。 此时可以在电脑上安装VmWare虚拟机软件&#xff0…

C:9-9题目:蛇形矩阵

一、题目介绍&#xff1a; 给你两个整数n&#xff0c;m&#xff0c;请你构造一个n行m列的蛇形方阵&#xff0c;在这个方阵中&#xff0c;数字由1到nm&#xff0c;从最右上角开始&#xff0c;呈环状(逆时针)向内填充。 比如一个3*3的蛇形方阵 3 2 1 4 9 8 5 6 7 二、解题思路&a…

Dropout正则化:提升PyTorch模型性能的神器!

本文展示了在PyTorch模型中添加Dropout正则化如何影响模型在损失和准确率方面的性能。 Dropout正则化在机器学习中的意义是什么&#xff1f; Dropout正则化是机器学习中的一种方法&#xff0c;通过在神经网络中随机丢弃一些单元&#xff08;神经元&#xff09;来模拟同时训练多…

explicit 的作用(如何避免编译器进行隐式类型转换)

目录 1. 隐式转换&#xff08;Implicit Conversion&#xff09; 2. 显式转换&#xff08;Explicit Conversion&#xff09; 3. 隐式转换的风险与显式转换的必要性 4. 隐式类型转换的例子 5. explicit 的作用 6. explicit 在构造函数中的作用 7. explicit 适用于转换操作…

常见网络层(卷积、池化、全连接)与其计算

卷积可视化&#xff1a;卷积神经网络 (CNN) 基本原理和公式_cnn公式-CSDN博客 嵌入大小计算规则【注意评论区全连接层计算规则勘误&#xff1a;Pv Wv Bv】 Conv、MaxPool、FC 池化操作和conv在kernels上计算不一致&#xff0c;在图像尺寸上的规则都是一样的。 公式可以理解…

解决windows远程桌面连接报错:这可能由于GredSSP加密数据库修正

这种问题需要修改一些远程端的安全级别 1.使用快捷键winr打开运行窗口 ------- 输入‘gpedit.msc’ 2.依次展开“计算机配置”->“管理模板”->“系统”->“凭据分配”设置名称&#xff1a; 加密数据库修正 3.双击“加密数据库修正”&#xff0c;将状态改为“启用”&a…

LDRA Testbed(TBrun)软件单元测试_实例讲解(对多次调用的函数打桩)

系列文章目录 LDRA Testbed软件静态分析_操作指南 LDRA Testbed软件静态分析_自动提取静态分析数据生成文档 LDRA Testbed软件静态分析_Jenkins持续集成&#xff08;自动静态分析并用邮件自动发送分析结果&#xff09; LDRA Testbed软件静态分析_软件质量度量 LDRA Testbed软件…

YOLOv10改进:CA注意力机制【注意力系列篇】(附详细的修改步骤,以及代码,目标检测效果优于SE和CBAM注意力)

YOLOv10改进&#xff1a;CA注意力机制【注意力系列篇】&#xff08;附详细的修改步骤&#xff0c;以及代码&#xff09; 如果实验环境尚未搭建成功&#xff0c;可以参考这篇文章 ->【YOLOv10超详细环境搭建以及模型训练&#xff08;GPU版本&#xff09;】 文章链接为&…

电脑pe是什么意思_电脑pe系统作用详细分析

有些小白很好奇&#xff0c;电脑pe是什么意思?所谓的电脑pe系统其实就是当我们的电脑出现问题而不能进入正常系统时候的一种“紧急备用”系统。如果需要重装操作系统的话&#xff0c;以往采用光盘使用的比较多&#xff0c;随着技术的进步&#xff0c;用u盘制作一个pe启动盘去安…

Kubernetes 系列 | k8s入门运维

目录 一、K8S集群搭建1.1 部署方式1.2 了解kubeadm1.3 部署流程1.3.1 初始化配置1.3.2 安装容器运行时1.3.3 安装K8S软件包1.3.4 创建集群 二、集群高可用1.1 集群高可用-堆叠1.2 集群高可用-集群外etcd 三、Pod运维3.1 Pod运维3.2 Pod的生命周期3.3 Pod状况3.4 Pod阶段3.5 容器…

【C++前缀和】3212. 统计 X 和 Y 频数相等的子矩阵数量|1672

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode3212. 统计 X 和 Y 频数相等的子矩阵数量 难度分&#xff1a;1672 给你一个二维字符矩阵 grid&#xff0c;其中 grid[i][j] 可能是 ‘X’、‘Y’ 或 ‘.’&a…

中秋佳节,科技好礼献团圆!五款数码好物大推荐

中秋节的到来&#xff0c;总是让人充满了对团圆和美好生活的向往。在这个家人团聚、朋友欢聚的美好时刻&#xff0c;除了享受月饼和团圆饭&#xff0c;还可以通过一些先进的数码好物&#xff0c;提升节日的愉悦感和生活的舒适度。从提升运动体验的南卡Runner Pro5&#xff0c;到…

Windows系统 安装 Nacos

使用说明&#xff1a;安装 Nacos 服务端&#xff0c;以单机模式启动&#xff0c;不用集群。 一、下载Nacos Nacos Server 下载 | Nacos 官网 下载解压后&#xff1a; bin&#xff1a;启动脚本&#xff1b;conf&#xff1a;配置文件 这个文件可以修改端口、增加数据库连接等配…

从零到一:为未上架APP开通微信商户支付服务的步骤详解

随着移动支付的普及&#xff0c;微信商户支付已成为众多商家不可或缺的一部分。然而&#xff0c;对于某些仍处于开发阶段或特殊需求下的APP来说&#xff0c;它们可能尚未在应用商店上架&#xff0c;但仍需接入微信支付功能以满足用户需求。本文将为您提供一份详细的微信商户支付…

2024年印尼金融科技报告解读(1) | 印尼金融科技发展现状与挑战

概述 金融科技的创新正加速全球金融普及和经济增长&#xff0c;尤其在东南亚&#xff0c;其影响尤为显著。 印尼作为该区域的经济龙头&#xff0c;凭借其庞大的人口基数和独特的地理位置&#xff0c;对"非接触式"服务和中小企业融资的需求迅猛增长&#xff0c;成为数…

mp3和mp4区别是什么?音视频转换,用这2个工具就够了

在刷视频的时候&#xff0c;在看电影的时候&#xff0c;在听歌的时候……我们经常能听到“mp3”、“mp4”这两种格式的名字。它们是什么格式&#xff1f;mp3和mp4区别是什么&#xff1f;我们能做什么&#xff1f; mp3是一种流行的音频编码格式&#xff0c;以其高效的压缩算法著…

屏幕空间UV 警戒线

屏幕空间UV 警戒线 屏幕UV已经抗锯齿

ueditor抓取图片

在ueditor.all.js文件中 修改catchremoteimage方法 原来的: 修改后: function catchremoteimage(imgs, callbacks) { //创建一个请求var oReq = new XMLHttpRequest() //获取请求地址前缀,根据自身项目获取const baseURL = http://uat.********* //url为请求地址根路径+具…

openGauss 数据库管理工具:DataKit 6.0 部署与配置实战

目录 一、DataKit简述 二、部署概要 三、系统规划 四、软件环境准备 1、关闭防火墙 2、配置时间同步 3、禁用 SELinux 4、关闭RemoveIPC 5、字符集设置 6、安装依赖包 五、openGauss DataKit部署与配置 1、openGauss 安装与配置 1.openGauss参数配置 2.重启 open…

React Native 0.76,New Architecture 将成为默认模式,全新的 RN 来了

关于 React Native 的 New Architecture 概念&#xff0c;最早应该是从 2018 年 RN 团队决定重写大量底层实现开始&#xff0c;因为那时候 React Native 面临各种结构问题和性能瓶颈&#xff0c;最终迫使 RN 团队开始进行重构。 而从 React Native 0.68 开始&#xff0c;New A…