首页 > 编程语言 >(算法)最后⼀块⽯头的重量————<堆>

(算法)最后⼀块⽯头的重量————<堆>

时间:2024-09-02 15:54:43浏览次数:11  
标签:stones int 重量 元素 最后 算法 heap 堆中 size

1. 题⽬链接:1046.最后⼀块⽯头的重量

2. 题⽬描述:

3. 解法(利⽤堆):

算法思路:

其实就是⼀个模拟的过程:

• 每次从⽯堆中拿出最⼤的元素以及次⼤的元素,然后将它们粉碎;

• 如果还有剩余,就将剩余的⽯头继续放在原始的⽯堆⾥⾯重复上⾯的操作,直到⽯堆⾥⾯只剩下⼀个元素,或者没有元素(因为所有的⽯头可能全部抵消了)

那么主要的问题就是解决:

• 如何顺利的拿出最⼤的⽯头以及次⼤的⽯头;

• 并且将粉碎后的⽯头放⼊⽯堆中之后,也能快速找到下⼀轮粉碎的最⼤⽯头和次⼤⽯头; 这不正好可以利⽤堆的特性来实现嘛?

• 我们可以创建⼀个⼤根堆;

• 然后将所有的⽯头放⼊⼤根堆中;

• 每次拿出前两个堆顶元素粉碎⼀下,如果还有剩余,就将剩余的⽯头继续放⼊堆中;

这样就能快速的模拟出这个过程。 

C++算法代码: 

class Solution 
{
public:
    int lastStoneWeight(vector<int>& stones) 
    {
        //创建一个大根堆
        priority_queue<int> heap;
        //将所有元素放入大根堆
        for(int temp:stones)
        {
            heap.push(temp);
        }
        while(heap.size()>1)
        {
            //取出两个最大元素
            int a=heap.top();
            heap.pop();
            int b=heap.top();
            heap.pop();
            if(a>b)
            {
                heap.push(a-b);
            }
        }
        //当堆中有元素时返回元素,没有元素时返回0
        return heap.size()?heap.top():0;
    }
};

Java算法代码:

class Solution
{
	public int lastStoneWeight(int[] stones)
	{
		// 1. 创建⼀个⼤根堆 
		PriorityQueue<Integer> heap = new PriorityQueue<>((a, b)->b - a);
		// 2. 把所有的⽯头放进堆⾥⾯ 
		for (int x : stones)
		{
			heap.offer(x);
		}
		// 3. 模拟 
		while (heap.size() > 1)
		{
			int a = heap.poll();
			int b = heap.poll();
			if (a > b)
			{
				heap.offer(a - b);
			}
		}
		return heap.isEmpty() ? 0 : heap.peek();
	}
}

标签:stones,int,重量,元素,最后,算法,heap,堆中,size
From: https://blog.csdn.net/2301_79580018/article/details/141820606

相关文章

  • 一个数独生成算法
    思路:创建一个9*9的数独数组,挨个往里面插入1-9的数值,并且验证该数值插入是否合理,该数值插入之后是否会导致生成错误数据,最后生成一张随机数独数据functiongetShuDu(){//创建初始数组letshudu=newArray(9);for(leti=0;i<9;i++){shudu[i]=newArray(9).fill(0)......
  • 书籍-《空间导航与跟踪:分析与算法》
    编辑:陈萍萍的公主@一点人工一点智能书籍:NavigationandTrackinginSpace:AnalysisandAlgorithms作者:SanatK.Biswas,AndrewG.Dempster出版:ArtechHouse01书籍介绍本书专注于人造空间物体的导航与跟踪,重点是对一系列广泛的空间任务进行动力学建模,包括:地球轨道卫星任务、发射......
  • 分布式概念及选举算法
    概念  由很多自主的计算机组成。很容易地把运行在不同计算机上的不同应用程序集成到单个系统中。清晰的记录接口。轻松的扩展。分布式类型:分布式计算系统、分布式信息系统(数据处理)互斥    集中式算法      每个程序在需要访问临界资源时,先给协调......
  • 基于FP-Growth算法进行数据集中频繁项集挖掘
    FP-Growth算法的主要步骤构建FP树(FrequentPatternTree):首先,扫描数据集一次,找出频繁项,并按支持度降序排列。然后,构建FP树,这是一个压缩表示的数据结构,其中每个项集对应树中的一个路径。挖掘FP树:从FP树中递归地挖掘频繁项集。这个过程通常从支持度最低的频繁项开始,逐步向上挖掘......
  • 基于C语言的选择排序算法
    一、选择排序算法的基本原理        选择排序算法是一种简单直观的排序算法。其基本原理为:        首先,将待排序的数组划分为已排序和未排序两部分。初始时,已排序部分为空,未排序部分为整个数组。        在每一轮排序中,从未排序部分找出最小(或最大)......
  • 基于C语言的归并排序算法
    一、归并排序的基本概念        归并排序(MergeSort)是一种基于分治法思想的高效稳定排序算法。其基本原理是将一个待排序的数组不断地分割成较小的子数组,直到每个子数组只包含一个元素,此时每个子数组都被认为是有序的。然后,再将这些有序的子数组合并成一个更大的有序......
  • 求从一固定点到其余点的最短路算法及其matlab程序详解
    #################本文为学习《图论算法及其MATLAB实现》的学习笔记#################算法用途从一固定点到其他所有点的最短路的求法算法思想利用求任意两点间最短路的程序,即可求出从固定点到其他所有点的最短路,从而得到所有的最短路和最短距离。若想查看每条通路所包......
  • 排序算法之二叉树排序详细解读(附带Java代码解读)
    二叉树排序(BinaryTreeSort)是一种基于二叉搜索树(BinarySearchTree,BST)实现的排序算法。它的基本思想是利用二叉搜索树的性质来实现排序,通过将元素插入到二叉搜索树中,然后对树进行中序遍历来获取排序后的元素。基本概念二叉搜索树(BST):对于二叉搜索树中的每一个节点,其左......
  • 安全帽ai自动识别算法
    安全帽ai自动识别算法是人工智能与视觉系统算法技术性的结合。通过10年的工艺累积,SuiJivision具备深层次的人工智能自主学习、图像识别、行为分析、发展趋势认知、风险预警等工作能力,安全帽ai自动识别算法可以根据认知情景动态性、即时解析和管理方法情景个人行为来预知未来的风......
  • 【工程应用十二】Bayer图像格式中Hamilton-Adams及Zhang Wu 基于LMMSS算法的Demosaic
    Demosaic,中文直接发翻译为去马赛克,但是其本质上并不是去除马赛克,这让很多第一次接触这个名词或者概念的人总会想的更多。因此,一般传感器在采集信息时一个位置只采集RGB颜色中的一个通道,这样可以减少采集量,降低成本,由于人的视觉对绿色最为敏感,所以一般情况下,绿色分量会比红色......