关于java:javaleetcode1423-可获得的最大点数-滑窗

原题链接在此附上:1423. 可取得的最大点数

这题有点意思,和咱们平时做题思维不太一样,所谓滑窗,我感觉咱们个别都会优先思考划后果范畴那个窗,然而这个题是反着来的,你要确定的后果是数组头部和尾部元素的最大和,并不适宜咱们间接进行滑窗操作,于是这道题的思路就变成了逆向操作,既然不能间接滑窗,就间接来,要求解头部和尾部元素的最大和,那是不是间接求整体的和而后减去数组两头元素最小和就是左右两端的最大和了?
所以咱们写代码时要确定的几件事事件便是:

咱们要划多大的窗?

已知咱们要求前后k个数之和最大值
设:数组长度为 n ,窗口大小为size
那咱们的滑窗大小即为,n-k(求解出n-k个数的最小和)。

那这个窗口要从哪开始划呢?

因为数组是无序的,咱们没有方法去直接判断从哪边开始划,咱们要确定进去一个区间,相加的值是最小的。

具体要怎么确定?

从头开始,前确定前 n-k 个数的和。
设咱们滑窗区间之和为 sum ,首先计算出数组元素 0 下标到下标 n-k-1 的和。
此时设最小和为 minsum , minisum 默认值和 sum 雷同。
咱们当初只是确认了数组前 n-k 个数的和,无奈保障这个和是最小的,所以咱们要开始遍历进行判断。

怎么判断和筛选区间呢?

当初咱们的窗口大小曾经确定为 n-k 了,剩下的工作就是滑动窗口,确定窗口内加起来的数和最小。
所以咱们要遍历数组剩下的地位,即 n-k 到 n 。
而后咱们要做的就是:窗口向右挪动的同时,窗口大小是固定的,有新的数字退出窗口中,那么我就要舍弃最右边的数字,这样能力保障咱们的窗口大小不变。
而后确定新加进来的数与剔除掉最左部的数之后的和与最小和的关系。
如果它比拟小,它将代替旧的最小和成为新的最小和。否则则持续遍历。
最终咱们还差一步操作,咱们求得是两头的最小和,不是题目要求的两端最大和。
所以咱们须要 求解整个数组的元素之和,而后减去两头的最小和,即为最终后果。

    public int maxScore(int[] cardPoints, int k) {
        int n = cardPoints.length; // 确定数组长度
        int size = n - k; // 确定滑窗区间
        int sum = 0; // 滑窗区间总和
        for(int i =0; i <size; i++){
            sum += cardPoints[i]; // 先确定区间内的元素个数
        }
        int minsum = sum; // 最小和先默认为区间总和
        for(int i = size; i < n; i++){
          
            sum += cardPoints[i]-cardPoints[i-size]; // 窗口滑动的同时,窗口区间总和会变动
            minsum = Math.min(sum,minsum); // 寻找滑窗区间最小和

        }
        return Arrays.stream(cardPoints).sum()-minsum; // 应用 stream.sum 求解数组之和而后利用数组总和减去两头滑窗区间的最小和即可确认边界最大和。
    }

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理