13 递归求解戳气球

来源:LeetCode第312题

难度:困难

描述:有n个气球,编号为0到n-1,每个气球上都标有一个数字,这些数字存在数组nums中,现在哟求你戳破所有的气球,戳破第i个气球,你可以获得nums[i-1]*nums[i]*nums[i+1]个隐蔽,这里的i-1和i+1代表和i相邻的两个气球的序号。若i-1或i+1超出了数组的边界,那么就把他当做一个数字为1的气球,求所能获得硬币的最大数量。分析:可以使用递归方式进行求解,每个递归函数都可以通过遍历戳破0到nums.length之间的元素,并将戳破后的剩余元素传入下一个递归函数中,下一个递归函数也进行这个规律,直到最后只剩下一个元素,并且用一个PriorityQueue记录所有的值,最后求出最大的那个元素。

 

//使用外层函数和内层函数进行处理,外层函数传参是nums数组
public int GetMaxProfit(int []nums)
{
//定义一个链表
Listlist=new LinkedList<>();
//将数组中所有元素放入链表中,因为要进行增删等操作
for(int i=0;imaxHeap=new PriorityQueue<>(Collections.reverseOrder);
//调用递归函数进行处理
getMaxProfit(list,0,maxHeap);
return maxHeap.peek();
}
//内部递归函数,传参是数字链表,之前戳气球是的累积和sum,最大堆引用
private void getMaxProfit(Listlist,int sum,PriorityQueue maxHeap)
{
//如果进行到链表中最后一项,则加入最大堆中并返回
if(list.size()==1)
{
sum+=list.get(0);
maxHeap.add(sum);
return ;
}
//遍历传递过来的list,
for(int i=0;i

知识点:定义整数链表List list=new LinkedList<>();链表中加入值list.add(number),向指定位置插值list.add(i,number);定义最大堆PriorityQueue maxHeap=new PriorityQueue<>(Collections.reverseOrder);向最大堆中添加元素maxHeap.add(number);推出第一个最大元素maxHeap.peek();

你可能感兴趣的:(JAVA刷题500道,算法,数据结构,java)