贪心
的
爱抖腿的嘻嘻嘻
这个作者很懒,什么都没留下…
展开
-
森林中的兔子
有一个数组,其中是兔子说和它一样的有几只,相同的兔子说的一定相同,但说的相同的不一定是相同的兔子,因为不是所有的兔子都说话了,求最少的兔子数量。可以用贪心来求,将数组排序,如果此时为arr[i],则有这种兔子的数量应该为arr[i]+1,那么可以跳过arr[i]+1这么多只兔子(如果后面数组也为arr[i]的话)和arr[i]不一样的话那就另外算。class Solution { public int numRabbits(int[] cs) { Arrays.sort(cs)原创 2021-04-06 11:45:06 · 228 阅读 · 0 评论 -
剪绳子
剪绳子将长为n的绳子剪成m段,m>1,求乘积最大值递归看到这个题首先是求最大值,所以是求最优解;其次是f(n)可以分解为max(f(i)*f(n-i)),所以可分解。然后他们之间是有重叠的部分的。所以可以先用递归来想再用动态规划从底往上。如果n<=4,则可以直接输出结果,也就是递归返回条件。如果n>=5,则前面的1到4是不用切就是最大的。后面的f(n)=max(cutRope(i)*cutrope(n-i)),for循环找到最大即可。动态规划如果n<=4.则可以直接输出原创 2020-11-13 09:17:11 · 67 阅读 · 0 评论 -
跳跃游戏2
一定可以到达最后,求到达最后需要的最短步数。这个题用动态规划也可以做,但时间很久。想一下其实没有必要算每一个地方可以到达的所有地方求最少,只要选一个最远的即可,也就是在一个位置能跳到的最远地方中选一个能跳最远的。用i来进行迭代表示现在的位置,res表示总的步数,max表示全局可以到达的最远位置(主要由i来更新),end表示此时可以到达的最远距离,也就是不用再跳一步已经可以到的最远距离。什么时候更新步数呢,就是当i等于end的时候需要再跳一步。记得是跳到最后一个就够了,所以直接不用遍历最后一个。cla原创 2021-03-11 15:56:41 · 60 阅读 · 0 评论 -
跳跃游戏
数组中存放着此时位置可以跳的距离。维护一个此时最大可到达位置,如果此时位置可到达,才更新此时的最大位置。如果超过最远下标则可到达。class Solution { public boolean canJump(int[] nums) { int max=0; for(int i=0;i<nums.length;i++){ if(max>=i)max=Math.max(i+nums[i],max);原创 2021-02-03 12:53:06 · 64 阅读 · 0 评论 -
区间合并4.插入区间
在一堆排好序的数组中插入区间大概思路还是遍历数组,如果此时数组在插入数组左边,则放入数组,如果此时数组在插入数组右边,则先插入插入数组(第一次),然后插入当前数组到结果数组(因为后面都是大于插入数组的了)。如果和插入区间重叠,则合并两个区间。import java.util.ArrayList;class Solution { public int[][] insert(int[][] intervals, int[] newInterval) { if(intervals==原创 2020-12-23 16:09:48 · 75 阅读 · 0 评论 -
区间调度3.合并给定数组区间
步骤就是先按照数组的左端点来排序,然后遍历排好序的数组,挨个合并,如果当前区间的左端点大于结果数组中最后一个区间的右端点,则把这个区间添加到结果数组中,如果小于,则合并他俩。最好返回list的数组形式list.toArray()就是返回一个数组形式的list,如果不加参数是返回一个object类型的值,如果加了参数是返回参数类型的数组。import java.util.Arrays;import java.util.ArrayList;class Solution { public int[原创 2020-12-23 15:44:53 · 128 阅读 · 1 评论 -
区间调度2.用最少的箭引爆气球
给了一些区间,求最少的弓箭可以引爆所有气球,也就是求最少有多少个不重叠的区间,和区间调度非常像。只不过边界也算重叠。为了保证不超过int的范围后points1-points2无法进行,所以直接改成比大小class Solution { public int findMinArrowShots(int[][] points) { if(points.length==0)return 0; Arrays.sort(points, new Compara原创 2021-03-11 11:52:10 · 54 阅读 · 0 评论 -
区间调度1.找到移除区间的最小数量
求出最多有几个互不相交的区间则做法是按end升序排序,选择一个结束最早的x,然后把区间中与它冲突的全部删除(别的区间的start要大于这个区间的end),接着重复步骤直到堆中没有区间。不用堆只用数组的话可以用一个for循环遍历整个数组,记录此时这个节点的start,如果它大于x的end,就令可选择数量加1,并更新x。找到要移除区间的最小数量,使得剩下的区间不重叠和求最多有几个不相交区间一样,统计方式不同罢了。class Solution { public int eraseOverlapI原创 2021-03-11 10:45:57 · 993 阅读 · 0 评论 -
任务调度器
给定一个字符数组,不同字符之间可以接着安排任务,相同字符需要等待n个时间后再执行,所有任务都要执行,求最短的执行时间,从贪心的角度可以想到先把任次数最多的任务找出来,因为所有任务都是1的执行时间,而且都要执行完,所以最多的任务决定了最短的执行时间,让它全部执行,中间空余n个时间,这样可以把所有的任务都插入到空隙之中。最后一行是否有任务取决于与最多的任务次数相同的任务有多少个。如图import java.util.Arrays;class Solution { public int leastI原创 2021-01-10 10:46:33 · 82 阅读 · 0 评论