【问题标题】:Find max rating(number) in an array where we cannot skip over 1 or more consecutive number in array在我们不能跳过数组中 1 个或多个连续数字的数组中查找最大评分(数字)
【发布时间】:2019-04-11 08:11:11
【问题描述】:

我们有一个评分数组,我们必须在这样一个范围内找到最大评分,这样我们就不能在一个数组中跳过一个或多个连续评分

Example-1: {9,-1,-3,-4,-5} output = 9 + -1 + -4 = 4

解释:我取了 9,我们必须取 -1 或 -3 我们不能直接跳到 -4,因为我们不能跳过 1 个或多个连续数字。

Example-2: {-1,-2,-3,-4,-5} output = -2 + -4 = -6  
Example-3: {-3,2,-4,-1,-2,5} output = 2 + -1 + 5 = 6   
Example-4: {9,-1,-3,4,5} output = 9 + -1 + 4 + 5 = 17

我尝试了下面的代码,但它在示例的情况下有效:2,3,4 但不是示例 1 在其他情况下同样失败。

static int maximizeRatings(int[] ratings) {
    int current = 0;
    boolean result = false;
    for(int j=0; j<ratings.length;j++){
        if(ratings[j]<0){
            result = true;
        }else{
        result = false; 
        }
    }
    if(result){
        return allnegatine(ratings);
    }
    for(int i=0; i<ratings.length;i++){
        if(i == ratings.length-1){
            if(ratings[i] > 0)
                current += ratings[i];
        }else{
        if(ratings[i] >0 && ratings[i+1]>0){
            current = ratings[i]+ratings[i+1];
            i++;
        }
        if(ratings[i] > ratings[i+1]){
            current += ratings[i];
        }else{
            current += ratings[i+1];
            i++;
        }
        }

    }
    return current;
}

private static int allnegatine(int[] ratings) {
    int current =0;
    for(int i=0; i<ratings.length;i++){
        if(ratings.length%2==0){
            if(i%2 == 0)
            current += ratings[i];
        }else{
            if(i%2!=0)
                current += ratings[i];
        }
    }
    return current;
}

在示例 1 等某些场景中没有被排除在外,我得到的是 -6 而不是 4,我正在尝试获取可以通过所有场景的正确代码。谢谢

【问题讨论】:

  • “我们不能跳过 1 个或多个连续数字”我真的不明白这一点。找到最大值时,您必须检查每个值,因为任何值都可能是最大值。那么,你为什么说你“不能跳过值”,暗示跳过一些可能是可取的?
  • 我认为他实际上的意思是不能跳过超过 1 个连续数字,即在遍历数组时,一次最多可以跳转 1 个数组元素。是这样吗,Hitesh?
  • 我完全不明白这些示例是如何设置的。比如哪些数字被取,哪些被跳过
  • 这些输出是如何计算的?它应该是什么?这里有什么规则?这还不清楚...如果您试图找到最大值,则没有跳过元素之类的东西,也没有进行计算(例如 1,最大值为 9)。明确你想要什么
  • OP 想要的不是max(set of numbers),而是max(sum(subset of numbers))

标签: java arrays algorithm data-structures


【解决方案1】:

这是一个动态规划问题。

dp[i] 是可以达到的最大评级,仅考虑数组中从零开始、结束于 i 并包括评级[i] 的部分。

dp[0]=ratings[0]
dp[1]=max(ratings[1],ratings[0]+ratings[1])
dp[i]=max(dp[i-1],dp[i-2])+ratings[i]

答案:max(dp[n-1],dp[n-2]) 其中 n 是评级数组的大小。

您也可以选择取消 dp 数组并为 dp[i-1] 和 dp[i-2] 保留 2 个变量。

【讨论】:

  • 你好@user3150716,我没有得到你的解决方案,我尝试了示例1但没有得到它是如何工作的,你能举个例子解释一下吗,谢谢
【解决方案2】:

这是典型的递归问题(只要输入数组相当长)。您应该检查项目并尝试所有可能的组合,然后选择最好的。

因为它看起来像典型的学校作业,所以我不确定是否应该粘贴我的解决方案。您应该自己弄清楚,或者至少了解发生了什么,以便下次自己实现它。

public class RatingService {

    public int calculate(List<Integer> input) {
        return recursion(input, true, 0);
    }

    private int recursion(List<Integer> sublist, boolean canSkip, int sum) {
        if (sublist.isEmpty()) {
            return sum;
        }
        int skippedSum = Integer.MIN_VALUE;
        int notSkippedSum;
        Integer integer = sublist.get(0);

        if (canSkip) {
            skippedSum = recursion(sublist.subList(1, sublist.size()), false, sum);
        }
        notSkippedSum = recursion(sublist.subList(1, sublist.size()), true, integer + sum);

        return skippedSum > notSkippedSum ? skippedSum : notSkippedSum;
    }
    }

【讨论】:

  • 谢谢 none_,它正在工作但无法理解,我需要检查递归是如何工作的。
【解决方案3】:

我认为您在检查 for 循环中的所有负数时犯了错误。如果数组中的最后一个元素是负数,那么“结果”变量将为真意味着所有数组都是负数,但实际上不是。

您必须将 for 循环替换为:

for(int j=0;j<ratings.length;j++){
    if(ratings[j]<0){
        result=true;
    }
    else{
        result = false;
        break;
    }
    }

它将在找到任何正数的索引处中断 for 循环,即:数组的所有元素都不是负数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    相关资源
    最近更新 更多