力扣每日一题
题目:2008. 出租车的最大盈利
简短说明
今天的解题有点曲折,完全是一步一步优化来的,看上面的截图,最开始的超时,超时后我加了记忆化搜索,虽然通过了,但是执行时间不太理想,接下来我稍微优化了下,但是执行时间基本没动过,接下来,又尝试着去掉递归,这次效果很显著,执行时间直接从2000多毫秒降低到了18毫秒
过程
下面我分别把这四次的代码都展示出来,记录下每次的优化,代码展示顺序是按照上面的截图从下往上的
超出时间限制
class Solution {public long maxTaxiEarnings(int n, int[][] rides) {List<int[]>[] prices = new ArrayList[n+1];for(int[] ride:rides){if(prices[ride[1]]==null){prices[ride[1]] = new ArrayList<>();}prices[ride[1]].add(new int[]{ride[0],ride[1]-ride[0]+ride[2]});}return dfs(n,prices);}long dfs(int index,List<int[]>[] prices){if(index==1){return 0;}long res = dfs(index-1,prices);if(prices[index]!=null){for(int[] price:prices[index]){res = Math.max(res,dfs(price[0],prices)+price[1]);}}return res;}
}
2219ms + 84.8MB
class Solution {public long maxTaxiEarnings(int n, int[][] rides) {List<int[]>[] prices = new ArrayList[n+1];for(int[] ride:rides){if(prices[ride[1]]==null){prices[ride[1]] = new ArrayList<>();}prices[ride[1]].add(new int[]{ride[0],ride[1]-ride[0]+ride[2]});}max = new long[n+1];return dfs(n,prices);} long[] max;long dfs(int index,List<int[]>[] prices){if(index==1){return 0;}long res = dfs(index-1,prices);if(prices[index]!=null){for(int[] price:prices[index]){if(max[price[0]]>0){res = Math.max(res,max[price[0]]+price[1]);}else{res = Math.max(res,dfs(price[0],prices)+price[1]);}}}max[index] = res;return res;}
}
2306ms + 84.2MB
class Solution {public long maxTaxiEarnings(int n, int[][] rides) {List<int[]>[] prices = new ArrayList[n+1];for(int[] ride:rides){if(prices[ride[1]]==null){prices[ride[1]] = new ArrayList<>();}prices[ride[1]].add(new int[]{ride[0],ride[1]-ride[0]+ride[2]});}max = new long[n+1];return dfs(n,prices);} long[] max;long dfs(int index,List<int[]>[] prices){if(index==1){return 0;}if(max[index]>0){return max[index];}long res = dfs(index-1,prices);if(prices[index]!=null){for(int[] price:prices[index]){res = Math.max(res,dfs(price[0],prices)+price[1]);}}max[index] = res;return res;}
}
18ms + 67.3MB
class Solution {public long maxTaxiEarnings(int n, int[][] rides) {List<int[]>[] prices = new ArrayList[n+1];for(int[] ride:rides){if(prices[ride[1]]==null){prices[ride[1]] = new ArrayList<>();}prices[ride[1]].add(new int[]{ride[0],ride[1]-ride[0]+ride[2]});}long[] max = new long[n+1];for(int i=2;i<=n;i++){max[i] = max[i-1];if(prices[i]!=null){for(int[] price:prices[i]){max[i] = Math.max(max[i],max[price[0]]+price[1]);}}}return max[n];}
}