冲刺春招-精选笔面试 66 题大通关 day6

2023-11-19

day6题目:33. 搜索旋转排序数组54. 螺旋矩阵bytedance-006. 夏季特惠

学习计划链接:冲刺春招-精选笔面试 66 题大通关

今日知识点:二分、模拟、01背包,难度为中等、中等、字节の简单

33. 搜索旋转排序数组

整数数组 nums 按升序排列,数组中的值 互不相同 。

在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。

示例 1:
输入:nums = [4,5,6,7,0,1,2], target = 0
输出:4

示例 2:
输入:nums = [4,5,6,7,0,1,2], target = 3
输出:-1

示例 3:
输入:nums = [1], target = 0
输出:-1

思路

两次二分,第一次查找分界点如例1、2中的0(153. 寻找旋转排序数组中的最小值),分界点左侧数一定都比右侧大且为升序,故根据target与第一个数比较判断在左侧找还是右侧找。注意特判一下nums[n-1] > nums[0]的情况(即旋转多次回到原数组的情况)

代码

class Solution {
public:
    int binarySearch(vector<int>& nums, int target, int s, int e) {
        int l = s, r = e;
        while(l <= r) { 
            int mid = (l+r)>>1;
            if(nums[mid] == target) return mid;
            if(nums[mid] < target) l = mid+1;
            else r = mid-1;
        }
        return -1;
    }
    int search(vector<int>& nums, int target) {
        int n = nums.size();
        int l = 0, r = n-1;
        int idx;
        if(nums[r] > nums[l]) idx = n-1;
        else {
            while(l < r) { // 找分界点 如0
                int mid = (l+r)>>1;
                if(nums[mid] == target) return mid;
                if(nums[mid] > nums[l]) l = mid;
                else r = mid;
            }
            idx = l;
        }
        if(target < nums[0])
            return binarySearch(nums, target, idx+1, n-1);
        else 
            return binarySearch(nums, target, 0, idx);
    }
};

54. 螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:
在这里插入图片描述
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

思路

某蓝桥杯经典真题稍稍变形- -
模拟每次就一直往右下左上的顺序走就行了

代码

/**
 * @param {number[][]} matrix
 * @return {number[]}
 */
var spiralOrder = function(matrix) {
    let m = matrix.length;
    let n = matrix[0].length;
    let sum = n*m;
    let vis = -200;
    let ans = [matrix[0][0]];
    matrix[0][0] = vis;
    let [i, j] = [0, 0];
    let cnt = 1;
    while(cnt < sum) {
        while(j+1 < n && matrix[i][j+1] != vis) {   // 往右走
            ans.push(matrix[i][j+1]);
            matrix[i][++j] = vis;
            ++cnt;
        }
        while(i+1 < m && matrix[i+1][j] != vis) {  // 往下走
            ans.push(matrix[i+1][j]);
            matrix[++i][j] = vis;
            ++cnt;
        }
        while(j-1 >= 0 && matrix[i][j-1] != vis) {  // 往左走
            ans.push(matrix[i][j-1]);
            matrix[i][--j] = vis;
            ++cnt;
        }
        while(i-1 >= 0 && matrix[i-1][j] != vis) {  // 往上走
            ans.push(matrix[i-1][j]);
            matrix[--i][j] = vis;
            ++cnt;
        }
    }
    return ans;
};

bytedance-006. 夏季特惠

某公司游戏平台的夏季特惠开始了,你决定入手一些游戏。现在你一共有X元的预算,该平台上所有的 n 个游戏均有折扣,标号为 i 的游戏的原价a[i]元,现价只要 b[i] 元(也就是说该游戏可以优惠 a[i]-b[i] 元)并且你购买该游戏能获得快乐值为 w[i] ,由于优惠的存在,你可能做出一些冲动消费导致最终买游戏的总费用超过预算,但只要满足获得的总优惠金额不低于超过预算的总金额,那在心理上就不会觉得吃亏。现在你希望在心理上不觉得吃亏的前提下,获得尽可能多的快乐值。

  • 输入
    • 第一行包含两个数 n 和 x 。
    • 接下来 n 行包含每个游戏的信息,原价 ai , 现价 bi,能获得的快乐值为 wi 。
  • 输出
    • 输出一个数字,表示你能获得的最大快乐值。

示例 1:
输入:
4 100
100 73 60
100 89 35
30 21 30
10 8 10
输出:100
解释:买 1、3、4 三款游戏,获得总优惠 38 元,总金额 102 元超预算 2 元,满足条件,获得 100 快乐值。

示例 2:
输入:
3 100
100 100 60
80 80 35
21 21 30
输出:60
解释:只能买下第一个游戏,获得 60 的快乐值。

思路

经典01背包问题,难点在于如何转换成背包问题qwq,看了题解才晓得
背包问题可看这篇博客:01背包问题详解(浅显易懂)
由题意易知(其实想了半天)每买一个游戏都会使预算加上该游戏的优惠价,再从预算里减掉现价,那么设优惠价为dis,若当前游戏优惠价 >= 现价的话买了是绝对不亏的(预算反而增加了),否则就将该游戏视作等待进行01背包的一员(取或不取)
还要注意下数据范围,w贼大,所以要用long long

完整代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 505;
const int maxm = 3e5;
int n, x, a, b, c, cnt;  // x为预算
int v[maxn];// 容量
ll ans, w[maxn];
int main() {
    cin >> n >> x;
    for(int i = 0; i < n; ++i) {
        cin >> a >> b >> c;    // 原价 现价 快乐值
        int dis = a-b;    // 优惠 每买一个游戏都会使预算加上优惠价,再从预算里减掉现价。
        if(dis > b) { // 所以优惠价大于现价的话一定买
            x += dis-b;
            ans += c;
        } else {
            v[cnt] = b-dis;
            w[cnt++] = c;
        }
    }
    vector<ll> dp(maxm, 0);
    for(int i = 0; i < cnt; ++i) {
        for(int j = x; j >= v[i]; --j) {
            dp[j] = max(dp[j], dp[j-v[i]]+w[i]);
        }
    }
    ans += dp[x]; 
    cout << ans << endl;
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

冲刺春招-精选笔面试 66 题大通关 day6 的相关文章

随机推荐

  • @JSONField 解决json字符串转对象,对象属性名与json中key不一致,如何接收数据问题

    背景 我有个对象 过来个json 想用这个对象接收json中的值 对象中属性名与json中key值不一致 实现 这个时候 JSONField注解就派上用场了 不能直接放在属性上 要放在set方法上 模拟 1 搞个对象 属性名分别为name
  • 【靶场】upload-labs Pass-02

    考纲 本pass在服务端对数据包的MIME进行检查 在右上角点击 查看提示 中看到 一 上一关 靶场 upload labs Pass 01 二 大马 介绍两款 php 大马 因为 一句话木马看不上 如果师傅有其他好用的 大马 还望师傅在评
  • QT添加qss文件和资源文件

    先右键项目 选择 Add New 选择一个模板 选择 Qt 模板 再选择 Qt Resource Files 点击 Choose 填上资源文件的名称 默认添加项目路径下 后面的步骤默认即可 点击完成 新建完成了资源文件后 默认会进入 res
  • 运放稳定性连载21:电容性负载的稳定性——具有双通道反馈的RISO(2)

    现在 我们必须测量如图10 6所示的Zo 小信号AC开环输出阻抗 该Tina SPICE测试电路将测试空载OPA177的Zo R2和R1以及LT为低通滤波器函数提供了一条AC通道 这样 使得我们能将DC短路和AC开路一起并入反馈电路 DC工
  • ssh报错no key alg(关于低版本连接高版本ssh)

    高版本 8 4 低版本 4 3 按照网上的方法试过 通过ssh keygen命令重新生成ssh主机秘钥 可以不用重启sshd服务 ssh keygen t rsa f etc ssh ssh host rsa key ssh keygen
  • NoReverseMatch: Reverse for ‘data‘ not found . ‘data‘ is not a valid view function or pattern

    Django gt python manage py runserver时报错 NoReverseMatch Reverse for data not found data is not a valid view func tion or
  • 制作一辆“自动驾驶”平衡自行车需要用到哪些知识

    目录 先看下小车效果 小车电路设计 相关软件工具 keil C语言设计编码调试工具 主要 mcuisp 代码烧录工具 一般使用一种烧录工具就可以 STM32 STlink stlink烧录工具 STM32 Cube pro 烧录工具 ope
  • C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现

    本文是转载的 正版是https blog twofei com 496 欢迎去看正版 C 中的虚函数 表 实现机制以及用C语言对其进行的模拟实现 前言 大家都应该知道C 的精髓是虚函数吧 虚函数带来的好处就是 可以定义一个基类的指针 其指向
  • OceanBase使用范例

    http www mysqlops com 2011 08 31 oceanbase use html OceanBase的使用类似于关系型数据库 需要预先创建schema 关于schema的格式 请参见schema说明 假如我们有以下sc
  • c#Socket 异步通讯(客户端与服务端)

    c Socket 异步通讯 多个客户端与服务端 最近公司有个项目 涉及到的通讯对象有点多 就拿其中一个库的通讯来说就用到了3个PLC 这里就涉及了一个服务器与多个客户端之间的通讯了 同时上位机既需要做客户端 也需要做服务端 因为跟PLC之间
  • HTTP响应详解, HTTP请求构造及HTTPS详解

    HTTP响应详解 认识 状态码 status code 状态码表示访问一个页面的结果 是访问成功 还是失败 还是其他的一些情况 以下为常见的状态码 200 OK 这 是一个最常见的状态码 表示访问成功 抓包抓到的大部分结果都是 200 例如
  • numpy load npz文件

    一 问题 numpy version 1 23 0 优化项目的是时候发现索引一个dict的时候很慢 因此进行分析 速度很慢的问题代码如下 arr dict np load test npz npz 100MB for i in range
  • 神州网信远程、关闭屏幕时间、关闭神州网信密码

    一 远程查看电脑 按 windows r 输入gpedit msc 运行组策略 gpedit msc 进行下面的操作 1 计算机配置 管理模板 Windows组件 远程桌面服务 远程桌面会话主机 连接 允许用户通过使用远程桌面服务进行远程连
  • Qt creator4.8.0 以上使用SqLite数据库进行数据操作

    文章目录 前言 一 在 pro工程文件中添加sql模块 二 使用步骤 1 添加头文件 2 链接并打开数据库 3 创建用户信息表management info 4 插入数据操作 5 修改数据库操作 6 查询数据库 总结 前言 Qt creat
  • 基于MATLAB的filter的使用,低通、带通和高通滤波器设计

    1 目的 学习MATLAB的filter函数的使用 通过设计低通 带通和高通滤波器对其进行仿真 2 用到的主要函数和工具 MATLAB FDATOOL filter fft 3 设计 信号的产生 Parameter Interface Fr
  • java高级开发面试题总结

    面试题总结 JAVA高级工程师 近期考虑换工作的问题 于是投简历面试 面试5家公司的高级Java工程师 有4家给了我offer 想着总结一下面试经验 方便最近正在寻求机会的你们 一 无笔试题 不知道是不是职位原因还是没遇到 面试时 都不需要
  • 阿里云轻量应用服务器使用指南适用于所有人

    最近一直在捣鼓阿里云服务器 想着把自己写好的一些项目部署到服务器上供其他人访问 一路上踩了不少坑 也查了不少资料 最后解决了 写个博客记录下来 也为其他想要建站的同学提供一个指引 购买轻量应用服务器 传送门 阿里云 如果是在校学生 可以直接
  • SpringCloud之Hystrix

    1 服务熔断与降级 在微服务架构中多层服务之间会相互调用 如果其中有一层服务故障了 可能会导致一层服务或者多层服务 故障 从而导致整个系统故障 这种现象被称为服务雪崩效应 SpringCloud 中的 Hystrix 组件就可以解决此类问题
  • 有时间再看decode详解

    Oracle 中 decode 函数用法 含义解释 decode 条件 值1 返回值1 值2 返回值2 值n 返回值n 缺省值 该函数的含义如下 IF 条件 值1 THEN RETURN 翻译值1 ELSIF 条件 值2 THEN RETU
  • 冲刺春招-精选笔面试 66 题大通关 day6

    day6题目 33 搜索旋转排序数组 54 螺旋矩阵 bytedance 006 夏季特惠 学习计划链接 冲刺春招 精选笔面试 66 题大通关 今日知识点 二分 模拟 01背包 难度为中等 中等 字节 简单 33 搜索旋转排序数组 整数数组