美文网首页
2106. 摘水果

2106. 摘水果

作者: 红树_ | 来源:发表于2023-05-03 18:59 被阅读0次

业精于勤,荒于嬉;行成于思,毁于随。

LeetCode 每日一题,参考2106. 摘水果,难度分2062。

题目

在一个无限的 x 坐标轴上,有许多水果分布在其中某些位置。给你一个二维整数数组 fruits ,其中 fruits[i] = [positioni, amounti] 表示共有 amounti 个水果放置在 positioni 上。fruits 已经按 positioni 升序排列 ,每个 positioni 互不相同 。

另给你两个整数 startPosk 。最初,你位于 startPos 。从任何位置,你可以选择 向左或者向右 走。在 x 轴上每移动 一个单位 ,就记作 一步 。你总共可以走 最多 k 步。你每达到一个位置,都会摘掉全部的水果,水果也将从该位置消失(不会再生)。

返回你可以摘到水果的 最大总数

解题思路

  • 前缀和:可以枚举两种情况,一种是向左走再回来,一种是向右走再回来,计算两种情况摘的水果的最大值即可,此时要计算区间和,可以使用前缀和简化计算。

前缀和

class Solution {
    public int maxTotalFruits(int[][] fruits, int startPos, int k) {
        //用前缀和计算到达区间的水果收益
        int n = fruits.length, maxPos = fruits[n-1][0];
        int[] preSum = new int[Math.max(maxPos+1,startPos+k+1)+1];
        for(int i = 0,j = 0;i < preSum.length-1; i++) {
            if(j < n && i == fruits[j][0]) {
                preSum[i+1] = preSum[i] + fruits[j][1];
                j++;//比较下一个水果
            } else {
                preSum[i+1] = preSum[i];
            }
        }
        //枚举区间找最大  
        int ans = 0;
        //枚举左边走多少步
        for(int i = 0; i <= k; i++) {
            //计算右边到达最大位置
            int leftPos = startPos - i,leftSteps = k - i;
            int rightPos = Math.max(leftPos + leftSteps,startPos);
            ans = Math.max(ans,preSum[rightPos+1]-preSum[Math.max(leftPos,0)]);
        }
        //枚举右边走多少步
        for(int i = 0; i <= k; i++) {
            //计算左边到达最小位置
            int rightPos = startPos + i,leftSteps = k - i;
            int leftPos = Math.min(Math.max(0,rightPos - leftSteps),startPos);
            ans = Math.max(ans,preSum[rightPos+1]-preSum[leftPos]);
        }
        return ans;
    }
}

复杂度分析

  • 时间复杂度:O(n),一重循环遍历,n为前缀和长度。
  • 空间复杂度:O(n),即前缀和使用空间。

相关文章

  • 摘水果

    金色的秋天,是一个收获的季节,奶奶家的果园里水果都成熟了。 我来到果园里,看到又红又大的苹果,好像挂上红...

  • 兔子摘水果

    树上有很多果子,芳香四溢让人喜悦 大家争相摘取,享受甜美带来的欢惬 猴子会爬树,摘要果子只需攀爬跳跃 乌鸦会飞翔,...

  • 摘水果西红柿

    今天我们去总寨摘水果西红柿。我们先去温室里找了一家又一家,好不容易才找到了一个骑着三轮车来他自己的温室的人。爸爸...

  • 摘文水果一二

    2020.10.13 周二 晴 28-15度 今天又是一个晴天,今天早餐是玉米、蕃薯加一个桔子或一支香蕉。最...

  • 萌宝日记176之上课有意思

    2018年8月4日 星期六 晴 今天上课的内容是摘水果,我们和老师到采摘园摘了好多水果,我还爬道高处摘了一个大椰子...

  • 绿夜语

    今日农忙至夜归 沿途一路摘野菜 顺便摘了一水果 看似水果实蔬菜 夜深人静好时节 正好同绿亲昵语

  • 愉快又充实的一天

    上午陪儿子上完体能课,跟儿子的好朋友和妈妈一起去果园摘水果,孩子课上的开心,水果也摘的开心,作为大人的我心情...

  • 水果现摘最好吃

    很小的时候就学过一个成语“瓜熟蒂落”,当时没有太深的概念,只是一个名词而已。直到第一次去到菜地里摘南瓜,妈妈拿着一...

  • 采摘这是我见过最好的地方

    这个季节可以采摘的地方很多:摘枇杷、摘桃子、摘李子……最值得期待的还是被誉为“五大健康水果之一”的蓝莓。 城区的采...

  • 【童话日记】郑思颖《尴尬》

    今天小兔子乖乖一家和小熊一家一起去水果园摘水果。 他们到了水果园门口看见门外有一个水果摊小兔和小熊...

网友评论

      本文标题:2106. 摘水果

      本文链接:https://www.haomeiwen.com/subject/roetsdtx.html