【LeetCode每日一题】——1046.最后一块石头的重量

server/2024/12/22 3:00:36/

文章目录

  • 一【题目类别】
  • 二【题目难度】
  • 三【题目编号】
  • 四【题目描述】
  • 五【题目示例】
  • 六【题目提示】
  • 七【解题思路】
  • 八【时间频度】
  • 九【代码实现】
  • 十【提交结果】

一【题目类别】

二【题目难度】

  • 简单

三【题目编号】

四【题目描述】

  • 有一石头,每块石头的重量都是正整数。
  • 每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x y,且 x <= y。那么粉碎的可能结果如下:
    • 如果 x == y,那么两块石头都会被完全粉碎;
    • 如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x
  • 最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0

五【题目示例】

  • 示例:
    • 输入:[2,7,4,1,8,1]
    • 输出:1
    • 解释:
      • 先选出 7 和 8,得到 1,所以数组转换为 [2,4,1,1,1],
      • 再选出 2 和 4,得到 2,所以数组转换为 [2,1,1,1],
      • 接着是 2 和 1,得到 1,所以数组转换为 [1,1,1],
      • 最后选出 1 和 1,得到 0,最终数组转换为 [1],这就是最后剩下那块石头的重量。

六【题目提示】

  • 1 <= stones.length <= 30
  • 1 <= stones[i] <= 1000

七【解题思路】

  • 只要了解优先队列)的知识点,这道题就很简单了
    • 我们只需将题目给定的所有元素构建为一个大顶(因为每次取出两个最大值)
    • 然后每次取出两个顶元素计算差值再放回大顶中重新将其构建即可(根据题意,若取出的两个值相等,则不再放回)
      • 如果最后大顶中还存在元素,这就是最后一块石头的重量,直接返回即可
      • 如果最后大顶中不存在元素,就返回0(题意)
  • 不过若要自己实现大顶,那么这道题就有些难度了(如下面用C语言对于本题的实现所示)
  • 具体细节请参考下面的代码

八【时间频度】

  • 时间复杂度: O ( n × l o g n ) O(n \times logn) O(n×logn) n n n为传入的参数值
  • 空间复杂度: O ( n ) O(n) O(n) n n n为传入的参数值

九【代码实现】

  1. Java语言版
class Solution {public int lastStoneWeight(int[] stones) {// 定义优先队列PriorityQueue<Integer> pQueue = new PriorityQueue<Integer>((a, b) -> b - a);// 构造大顶for (Integer stone : stones) {pQueue.offer(stone);}// 使用大顶计算最后一块石头的重量while (pQueue.size() > 1) {// 取出大顶中的两个最大值int x = pQueue.poll();int y = pQueue.poll();// 这里只有两种情况,如果x==y,忽略即可,因为其值为0,另一种情况就是x > y,根据题目要求,将x - y重新加入大顶if (x > y) {pQueue.offer(x - y);}}// 根据题目要求返回结果return pQueue.size() == 0 ? 0 : pQueue.poll();}
}
  1. Python语言版
class Solution:def lastStoneWeight(self, stones: List[int]) -> int:# 构造大顶heap = [-stone for stone in stones]heapq.heapify(heap)# 使用大顶计算最后一块石头的重量while len(heap) > 1:# 取出大顶中的两个最大值x = -heapq.heappop(heap)y = -heapq.heappop(heap)# 这里只有两种情况,如果x==y,忽略即可,因为其值为0,另一种情况就是x > y,根据题目要求,将x - y重新加入大顶if x > y:heapq.heappush(heap, -(x - y))# 根据题目要求返回结果return -heapq.heappop(heap) if len(heap) else 0
  1. C语言版
// 交换元素值
void swap(int *a, int *b)
{int temp = *a;*a = *b;*b = temp;
}// 将一个新元素插入到大顶
void push(int *heap, int *heapSize, int x)
{heap[++(*heapSize)] = x;for (int i = (*heapSize); i > 1 && heap[i] > heap[i >> 1]; i >>= 1){swap(&heap[i], &heap[i >> 1]);}
}// 从大顶中移除顶元素
void pop(int *heap, int *heapSize)
{int temp = heap[(*heapSize)];heap[1] = heap[(*heapSize)--];int i = 1;int j = 2;while (j <= (*heapSize)){if (j != (*heapSize) && heap[j + 1] > heap[j]){++j;}if (heap[j] > temp){heap[i] = heap[j];i = j;j = i << 1;}else{break;}}heap[i] = temp;
}// 查看大顶顶元素
int top(int *heap)
{return heap[1];
}int lastStoneWeight(int* stones, int stonesSize)
{// 边界条件if (stonesSize == 1){return stones[0];}if (stonesSize == 2){return fabs(stones[0] - stones[1]);}// 构造大顶int heap[stonesSize + 1];int heapSize = 0;for (int i = 0; i < stonesSize; i++){push(heap, &heapSize, stones[i]);}// 使用大顶计算最后一块石头的重量while (heapSize > 1){// 取出大顶中的两个最大值int x = top(heap);pop(heap, &heapSize);int y = top(heap);pop(heap, &heapSize);// 这里只有两种情况,如果x==y,忽略即可,因为其值为0,另一种情况就是x > y,根据题目要求,将x - y重新加入大顶if (x > y){push(heap, &heapSize, x - y);}}// 根据题目要求返回结果return heapSize ? top(heap) : 0;
}

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. Python语言版
    在这里插入图片描述

  3. C语言版
    在这里插入图片描述


http://www.ppmy.cn/server/104934.html

相关文章

【Java 搜索二维矩阵 I II,多数元素 I II,分治法 二分法 摩尔投票法】

搜索二维矩阵 I II&#xff0c;多数元素&#xff0c;分治法 & 二分法 & 摩尔投票法 题目1&#xff1a;力扣-搜索二维矩阵[https://leetcode.cn/problems/search-a-2d-matrix/description/](https://leetcode.cn/problems/search-a-2d-matrix/description/)分治-排除法分…

电脑无法新建 Word Excle PPT 这些文件是咋回事

咦 我的电脑怎么没有 Excel文件 Word文件 和 PPT选项嘞 &#xff01;&#xff01; 今天突然要写个材料&#xff0c;发现自己新建文件竟然没有excel文档 word和ppt幻灯片这些选项。哦 原来是我自己上次把电脑从win7升级win10系统之后还没有安装wps这些所以不能使用。如果你的电…

【c++】强制类型转化

一、前言 在C语言中新增了四个关键字static_cast、const_cast、reinterpret_cast和dynamic_cast。这四个关键字都是用于强制类型转换的。 新类型的强制转换可以提供更好的控制强制转换过程&#xff0c;允许控制各种不同种类的强制转换。 C中风格是static_cast<type>(c…

ARM/Linux嵌入式面经(二六):韶音

面试体验很好,流程规范,HR细心热情,目前秋招体验最好的一家公司。 一面HR面30min: 1.自我介绍 2.课题组主要做的什么方向 3.聊一聊项目,内容,团队,分工 4.课题组多少人等等。。 5.唠家常 6.其他公司进度 7.意向薪资 二面技术面20min 1.自我介绍 2.OTA 在嵌入式…

linux tomcat jenkins 迁移

最近由于我们的测试和生产环境jenkins频频发生错误&#xff0c;索性尝试了一把在阿里云上做jenkins迁移 在阿里云jenkins安装模式是用tomcat安装部署的 [rootk8s-master local]# ls aegis bin cloudmonitor etc games go ilogtail include lib lib64 libexec sbin…

高性能Web服务器

Nginx的架构和安装Nginx的概述 Nginx &#xff1a; engine X &#xff0c; 2002 年开发&#xff0c;分为社区版和商业版 (nginx plus ) 2019 年 3 月 11 日 F5 Networks 6.7 亿美元的价格收购 Nginx 是免费的、开源的、高性能的 HTTP 和反向代理服务器、邮件代理服务器、以及 T…

【Qt笔记】QPushButton控件详解

目录 一、概述 二、属性 三、方法 四、信号与槽 五、QPushButton的主要功能 六、QPushButton的常用函数方法 1. 构造函数 2. 设置与获取文本 3. 设置与获取图标 4. 设置与获取快捷键 5. 连接信号和槽 6. 启用和禁用按钮 7. 设置默认按钮和自动默认按钮 七、QPush…

DM8守护集群部署、数据同步验证、主备切换

1. 环境描述 实例详情 端口详情 2. 部署步骤 2.1 数据准备 2.1.1主库初始化 [dmdbaray1 ~]$ cd /dmdba/dmdbms/bin [dmdbaray1 bin]$ ./dminit path/dmdba/data PAGE_SIZE32 EXTENT_SIZE32 CASE_SENSITIVEy CHARSET1 DB_NAMEGRP1_RT_01 INSTANCE_NAMEGRP1_RT_01 PORT_NU…