Leetcode.2146 价格范围内最高排名的 K 样物品

news2024/11/24 16:37:31

题目链接

Leetcode.2146 价格范围内最高排名的 K 样物品 rating : 1837

题目描述

给你一个下标从 0 0 0 开始的二维整数数组 g r i d grid grid ,它的大小为 m x n ,表示一个商店中物品的分布图。数组中的整数含义为:

  • 0 表示无法穿越的一堵墙。
  • 1 表示可以自由通过的一个空格子。
  • 所有其他正整数表示该格子内的一样物品的价格。你可以自由经过这些格子。
    从一个格子走到上下左右相邻格子花费 1 步。

同时给你一个整数数组 p r i c i n g pricing pricing s t a r t start start ,其中 pricing = [low, high]start = [row, col] ,表示你开始位置为 (row, col) ,同时你只对物品价格在 闭区间 [ l o w , h i g h ] [low, high] [low,high] 之内的物品感兴趣。同时给你一个整数 k k k

你想知道给定范围 内 且 排名最高 k k k 件物品的 位置 。排名按照优先级从高到低的以下规则制定:

  • 距离:定义为从 start 到一件物品的最短路径需要的步数(较近 距离的排名更高)。
  • 价格:较低 价格的物品有更高优先级,但只考虑在给定范围之内的价格。
  • 行坐标:较小 行坐标的有更高优先级。
  • 列坐标:较小 列坐标的有更高优先级。

请你返回给定价格内排名最高的 k k k 件物品的坐标,将它们按照排名排序后返回。如果给定价格内少于 k k k 件物品,那么请将它们的坐标 全部 返回。

示例 1:

在这里插入图片描述

输入:grid = [[1,2,0,1],[1,3,0,1],[0,2,5,1]], pricing = [2,5], start = [0,0], k = 3
输出:[[0,1],[1,1],[2,1]]
解释:起点为 (0,0) 。
价格范围为 [2,5] ,我们可以选择的物品坐标为 (0,1),(1,1),(2,1) 和 (2,2) 。
这些物品的排名为:

  • (0,1) 距离为 1
  • (1,1) 距离为 2
  • (2,1) 距离为 3
  • (2,2) 距离为 4 所以,给定价格范围内排名最高的 3 件物品的坐标为 (0,1),(1,1) 和 (2,1) 。

示例 2:

在这里插入图片描述

输入:grid = [[1,2,0,1],[1,3,3,1],[0,2,5,1]], pricing = [2,3], start = [2,3], k = 2
输出:[[2,1],[1,2]]
解释:起点为 (2,3) 。
价格范围为 [2,3] ,我们可以选择的物品坐标为 (0,1),(1,1),(1,2) 和 (2,1) 。
这些物品的排名为:

  • (2,1) 距离为 2 ,价格为 2
  • (1,2) 距离为 2 ,价格为 3
  • (1,1) 距离为 3
  • (0,1) 距离为 4 所以,给定价格范围内排名最高的 2 件物品的坐标为 (2,1) 和 (1,2) 。

示例 3:

在这里插入图片描述

输入:grid = [[1,1,1],[0,0,1],[2,3,4]], pricing = [2,3], start = [0,0], k = 3
输出:[[2,1],[2,0]]
解释:起点为 (0,0) 。
价格范围为 [2,3] ,我们可以选择的物品坐标为 (2,0) 和 (2,1) 。
这些物品的排名为:

  • (2,1) 距离为 5
  • (2,0) 距离为 6 所以,给定价格范围内排名最高的 2 件物品的坐标为 (2,1) 和 (2,0) 。 注意,k = 3 但给定价格范围内只有 2 件物品。

提示:

  • m = g r i d . l e n g t h m = grid.length m=grid.length
  • n = g r i d [ i ] . l e n g t h n = grid[i].length n=grid[i].length
  • 1 ≤ m , n ≤ 1 0 5 1 \leq m, n \leq 10^5 1m,n105
  • 1 ≤ m × n ≤ 105 1 \leq m \times n \leq 105 1m×n105
  • 0 ≤ g r i d [ i ] [ j ] ≤ 105 0 \leq grid[i][j] \leq 105 0grid[i][j]105
  • p r i c i n g . l e n g t h = 2 pricing.length = 2 pricing.length=2
  • 2 ≤ l o w ≤ h i g h ≤ 105 2 \leq low \leq high \leq 105 2lowhigh105
  • s t a r t . l e n g t h = 2 start.length = 2 start.length=2
  • 0 ≤ r o w ≤ m − 1 0 \leq row \leq m - 1 0rowm1
  • 0 ≤ c o l ≤ n − 1 0 \leq col \leq n - 1 0coln1
  • g r i d [ r o w ] [ c o l ] > 0 grid[row][col] > 0 grid[row][col]>0
  • 1 ≤ k ≤ m × n 1 \leq k \leq m \times n 1km×n

解法:bfs + 排序

d i s t dist dist 记录从起点 ( s t a r t [ 0 ] , s t a r t [ 1 ] ) (start[0] , start[1]) (start[0],start[1]) 到每一个位置的最短距离。

在遍历的过程中我们只记录价格 g r i d [ i ] [ j ] grid[i][j] grid[i][j] [ p r i c i n g [ 0 ] , p r i c i n g [ 1 ] ] [pricing[0] , pricing[1]] [pricing[0],pricing[1]]区间的位置。

记录的形式为 {距离,价格,位置},即 { d i s t [ i ] [ j ] , g r i d [ i ] [ j ] , ( i , j ) } \{dist[i][j] , grid[i][j] , (i,j) \} {dist[i][j],grid[i][j],(i,j)}

然后对其进行排序:

  • 如果距离不一样,距离小的排在前面;
  • 如果价格不一样,价格小的排在前面;
  • 如果行坐标不一样,行坐标小的排在前面;
  • 如果列坐标不一样,列坐标小的排在前面;

排序完之后,我们取前 k k k 个元素的位置,将其插入答案数组 a n s ans ans 即可。

时间复杂度: O ( m × n + m × n × l o g ( m × n ) ) O(m \times n + m \times n \times log(m \times n)) O(m×n+m×n×log(m×n))

C++代码:

using PII = pair<int,int>;

const int dx[4] = {1,0,-1,0};
const int dy[4] = {0,1,0,-1};

class Solution {
public:
    vector<vector<int>> highestRankedKItems(vector<vector<int>>& grid, vector<int>& pricing, vector<int>& start, int k) {
        vector<vector<int>> ans;
        int l = pricing[0] , r = pricing[1];

        int m = grid.size() , n = grid[0].size();


        vector<vector<int>> dist(m,vector<int>(n,1e9));

        vector<tuple<int,int,PII>> a;
        queue<PII> q;
        dist[start[0]][start[1]] = 0;
        q.emplace(start[0],start[1]);

        while(!q.empty()){
            auto [x,y] = q.front();
            q.pop();

            int p = grid[x][y];
            if(p >= l && p <= r){
                auto t = make_tuple(dist[x][y],p,make_pair(x,y));
                a.emplace_back(t);
            }

            for(int i = 0;i < 4;i++){
                int nx = x + dx[i] , ny = y + dy[i];
                if(nx < 0 || nx >= m || ny < 0 || ny >= n || grid[nx][ny] == 0 || dist[nx][ny] != 1e9) continue;
                dist[nx][ny] = dist[x][y] + 1;
                q.emplace(nx,ny);
            }
        }

        sort(a.begin(),a.end(),[&](auto &a,auto &b){
            int d1 = get<0>(a) , d2 = get<0>(b);
            int p1 = get<1>(a) , p2 = get<1>(b);
            int x1 = get<2>(a).first , y1 = get<2>(a).second;
            int x2 = get<2>(b).first , y2 = get<2>(b).second;

            if(d1 != d2) return d1 < d2;
            else if(p1 != p2) return p1 < p2;
            else if(x1 != x2) return x1 < x2;
            else return y1 < y2;
        });


        int len = min((int)a.size() , k);

        for(int i = 0;i < len;i++){
            auto x = get<2>(a[i]).first , y = get<2>(a[i]).second;
            ans.push_back({x,y});
        }

        return ans;
    }
};

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

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

相关文章

伪原创小发猫怎么样【php源码】

大家好&#xff0c;小编为大家解答初学者自学python哪本书好的问题。很多人还不知道自学python需要什么基础&#xff0c;现在让我们一起来看看吧&#xff01; 火车头采集ai伪原创插件截图&#xff1a; 目前python可以说是一门非常火爆的编程语言&#xff0c;应用范围也非常的广…

TCP三次握手、四次握手过程,以及原因分析

TCP的三次握手和四次挥手实质就是TCP通信的连接和断开。 三次握手&#xff1a;为了对每次发送的数据量进行跟踪与协商&#xff0c;确保数据段的发送和接收同步&#xff0c;根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系&#xff0c;并建立虚连接。 四次挥手&…

vs code remote ssh: Resolver error: Error: Got bad result from install script

今天像往常一样&#xff0c;打开 windows 11&#xff0c;使用 vs code 远程连接服务器 ubuntu 20&#xff0c;但是遇到了一个错误&#xff1a;Resolver error: Error: Got bad result from install script。 ok&#xff01;&#xff01;&#xff01;开始 Bing &#xff01;&…

.Net C# 免费PDF合成软件

最近用到pdf合成&#xff0c;发现各种软件均收费啊&#xff0c;这个技术非常简单&#xff0c;别人写好的库一大把&#xff0c;这里用到了PDFsharp&#xff0c;项目地址Home of PDFsharp and MigraDoc Foundation 软件下载地址 https://download.csdn.net/download/g313105910…

OBD针脚定义参考

OBD定义的一种标准的参考&#xff0c;不同的车场有不同的定义&#xff0c;貌似没有统一。 在某宝上看到的ODB转db9的不同的线序&#xff1a; 1&#xff09;1/2/3/6几个针脚都是一样的&#xff0c;分别上下针脚对应。 2&#xff09;其中一种4/5/7/8也是上下对应的&#xff1b;另…

检验代码生成器完成版

写维护页面重复逻辑写烦了&#xff0c;连页面的增、删、改、查、弹窗等代码都不行手写了&#xff0c;为此做成代码生成器成型版1.0.干到10点。。。 代码&#xff1a; Class Demo.CodeGener Extends %RegisteredObject {/// 生成操作表相关的代码&#xff0c;包括M、C#调用代码…

有效管理IT问题的5个原则

问题管理就是发现未知的、隐藏的问题&#xff0c;这是根本原因&#xff0c; 这是您 IT 帮助台无穷无尽的工单来源。当您实施有效的 问题管理&#xff0c;您的 IT 团队可以超越消防模式&#xff0c;专注于战略 IT 目标。以下是可以帮助您实现一流问题管理的五个原则&#xff1a;…

远程运维大批量IT设备?向日葵批量部署、分组授权与安全功能解析

数字化转型的不断推进&#xff0c;给予了企业全方位的赋能&#xff0c;但任何发展都伴随着成本与代价&#xff0c;比如在数字化转型过程中企业内部办公与外部业务所需的不断增加的IT设备数量&#xff0c;就为日常的运维工作提出了更大的挑战。 针对企业面对海量IT设备时的运维…

多态总结

什么是多态&#xff1f; 所谓多态&#xff0c;就是同一个操作&#xff0c;作用在了不同的对象上&#xff0c;就会有不同的解释&#xff0c;进而产生不同的执行结果。使用时&#xff0c;是采用父类指针指向子类对象的方法。其中&#xff0c;重载和重写是常见的实现多态的手段。…

【MySQL】基础知识(一)

MySQL基础知识&#xff08;一&#xff09; 文章目录 MySQL基础知识&#xff08;一&#xff09;00 MySQL安装01 数据库介绍1.1 什么是数据库1.2数据库分类 02 SQL分类03 数据库操作3.1显示数据库3.2创建数据库3.3选中数据库3.4删除数据库 04 常用数据类型4.1数值类型4.2字符串类…

LeetCode 0024. 两两交换链表中的节点:粗暴易懂的方法(几个临时变量)

【LetMeFly】24.两两交换链表中的节点&#xff1a;粗暴易懂的方法&#xff08;几个临时变量&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/swap-nodes-in-pairs/ 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点…

安路FPGA的赋值报错——移位处理,加括号

authordaisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主 在使用移位符号用来当作除以号使用时&#xff0c;发现如下问题 其中 cnt_8K 为偶数和奇数时输出的数据不一样 reg [10:0] cnt_8K; reg [10:0] ram1_addra; always(posedge clk_16M) begin if(ram_out_flag )begin if(…

2023年新手如何学剪辑视频 想学视频剪辑如何入门

随着短视频、vlog等媒体形式的兴起&#xff0c;视频剪辑已经成为了热门技能。甚至有人说&#xff0c;不会修图可以&#xff0c;但不能不会剪视频。实际上&#xff0c;随着各种智能软件的发展&#xff0c;视频剪辑已经变得越来越简单。接下来&#xff0c;一起来看看新手如何学剪…

重磅来袭!Android UI设计规范助你打造精美Android应用!

重磅来袭&#xff01;Android UI设计规范助你打造精美Android应用&#xff01; 为了规范Android UI设计&#xff0c;Google官方推出UI设计指南助你打造精美的Android应用。 使用 Android 主题和组件创建应用设计。利用 Android 独特的设计模式和产品打造精美、易用的现代应用…

nginx之location匹配的规则和优先级,以及rewrite

主要内容&#xff1a;一、location匹配的规则和优先级&#xff08;重点&#xff0c;面试会问&#xff0c;工作用得到&#xff09; 二、nginx常用的问题&#xff08;要求掌握&#xff09; 三、rewrite&#xff1a;重定向功能&#xff08;有掌握&#xff0c;有理解&#xff09;…

DNS:使用 bind9 配置主从权威DNS服务器

写在前面 分享一些 使用 bind9 配置主从权威名称服务器的笔记理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#xff0c;是人的逃避方式…

设计模式行为型——策略模式

在现实生活中常常遇到达成某种目的&#xff0c;有多种实现策略可供选择的情况。例如&#xff0c;出行上班可以乘坐公交车、乘坐地铁、骑自行车或自己开私家车等&#xff0c;填饱肚子可以吃火锅、吃烤肉、吃烤串、吃东北家常菜等方法。 在软件开发中也常常遇到类似的情况&#x…

人物启示-张一鸣与陆奇

在科技行业中&#xff0c;张一鸣与陆奇可谓是两位颇具影响力的人物。张一鸣和陆奇分别是字节跳动&#xff08;TikTok 的母公司&#xff09;的创始人和百度前总裁。张一鸣作为字节跳动的创始人&#xff0c;成功打造了今日头条、抖音等知名产品&#xff0c;而陆奇则曾任微软副总裁…

计算机组成与设计01:计算机的抽象与技术

目录 1 概述 1.1 计算机体系结构体中的8个伟大思想 1.2 计算机层次结构 1.2.1 概述 1.2.2 指令集体系结构 1.3 实例&#xff1a;从程序到电子信号 1.3.1 从高级语言到汇编语言 1.3.2 从汇编语言到机器语言 1.3.3 生成可执行文件并执行 1.3.4 计算机基本执行结构 1.3…

【vue3】基础知识点-computed和watch

学习vue3&#xff0c;都会从基础知识点学起。了解setup函数&#xff0c;ref&#xff0c;recative&#xff0c;watch、computed、pinia等如何使用 今天说vue3组合式api&#xff0c;computed和watch 在vue3中&#xff0c;computed和watch仍然是非常有用的特性&#xff0c;帮助处…