牛客NC166 连续子数组的最大和(二)【中等 前缀和数组+动态规划 Java/Go/PHP/C++】

题目

在这里插入图片描述
在这里插入图片描述
题目链接:
https://www.nowcoder.com/practice/11662ff51a714bbd8de809a89c481e21

思路

前缀和数组+动态规划

Java代码

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param array int整型一维数组
     * @return int整型一维数组
     */
    public int[] FindGreatestSumOfSubArray (int[] array) {
        //前缀和+动态规划
        int n = array.length;
        if (n <= 1) return array;

        int[] presum = new int[n + 1]; //前缀和
        for (int i = 0; i < n; i++) {
            presum[i + 1] = presum[i] + array[i];
        }
        int[] dp = new int[n];
        dp[0] = array[0];
        int pre = array[0];
        int maxSum = array[0];
        int maxSumEnd = 0;
       //存放最的子数组和的子数组下标列表
        List<Integer> maxsumll = new ArrayList<>();
        for (int i = 1; i < n ; i++) {
            int p1 = array[i];
            int p2 = array[i] + pre;
            int cur = Math.max(p1, p2);
            //maxSum=Math.max(maxSum,cur);

            if (maxSum <= cur) {
                if (maxSum < cur) {
                    maxsumll.clear();

                }
                maxsumll.add(i);
                maxSum = cur;
                maxSumEnd = i;
            }
            pre = cur;
        }

        //System.out.println(maxSum+", "+maxSumEnd);
        //System.out.println(sumIdx);
        int maxSize = 0;
        int maxSizeIdx = 0;
        for (Integer idx : maxsumll) {

            //for (int i = idx; i <=idx ; i++) {
            for (int j = 0; j <= idx ; j++) {
                if (presum[idx + 1] - presum[j] == maxSum) {
                    //size=Math.max(size,idx+1-j);
                    if (maxSize < idx + 1 - j) {
                        maxSize = idx + 1 - j;
                        maxSizeIdx = idx;
                    }
                    break;
                }
                //  }
            }
        }

        // System.out.println("size:"+ maxSize+" maxSizeidx:"+ maxSizeIdx);
        int[] ans = new int[maxSize];
        for (int i = 0; i < maxSize ; i++) {
            ans[i] = array[maxSizeIdx - maxSize + 1 + i];
        }
        return ans;
    }
}

Go代码

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param array int整型一维数组
 * @return int整型一维数组
 */
func FindGreatestSumOfSubArray(array []int) []int {
	//前缀和+动态规划
	n := len(array)
	if n <= 1 {
		return array
	}

	presum := make([]int, n+1)
	for i := 0; i < n; i++ {
		presum[i+1] = presum[i] + array[i]
	}

	pre := array[0]
	maxSum := array[0]
	maxSumll := []int{} //存放最的子数组和的子数组下标列表

	for i := 1; i < n; i++ {
		p1 := array[i]
		p2 := array[i] + pre

		cur := p1
		if cur < p2 {
			cur = p2
		}

		if maxSum <= cur {
			if maxSum < cur {
				maxSumll = []int{}
			}
			maxSum = cur
			maxSumll = append(maxSumll, i)
		}

		pre = cur
	}

	maxSize := 0
	maxSizeIdx := 0

	for _, idx := range maxSumll {
		for j := 0; j <= idx; j++ {
			if presum[idx+1]-presum[j] == maxSum {
				if maxSize < idx+1-j {
					maxSize = idx + 1 - j
					maxSizeIdx = idx
				}

				break
			}

		}
	}

	ans := make([]int, maxSize)
	for i := 0; i < maxSize; i++ {
		ans[i] = array[maxSizeIdx+1-maxSize+i]
	}
	return ans
}

PHP代码

<?php


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param array int整型一维数组 
 * @return int整型一维数组
 */
function FindGreatestSumOfSubArray( $array )
{
    //前缀和+动态规划
    $n= count($array);
    if($n <=1){
        return $array;
    }

    $presum = [0=>0];
    for($i=0;$i<$n;$i++){
        $presum[$i+1] = $presum[$i]+$array[$i];
    }

    $pre = $array[0];
    $max = $array[0];
    $list = array(); //存放$max对应的子数组的结束下标

    for($i=1;$i<$n;$i++){
        $cur = $array[$i];
        $p2 = $array[$i]+$pre;
        if($cur < $p2){
            $cur = $p2;
        }

        if($max<=$cur){
            if($max<$cur) {
                $list = array();
            }
            $list[count($list)] = $i;
            $max = $cur;
        }

        $pre=$cur;
    }


    $maxLen =0;
    $maxLenIdx =0;

    foreach ($list as $idx){
        for($j=0;$j<=$idx;$j++){
           if($presum[$idx+1] -$presum[$j] ==$max){
               if($maxLen < $idx+1-$j){
                   $maxLen = $idx+1-$j;
                   $maxLenIdx = $idx;
               }
               break;
           }
        }
    }


    $ans=[];
    for($i=0;$i<$maxLen;$i++){
        $ans[$i] = $array[$maxLenIdx-$maxLen+1+$i];
    }
    return $ans;
}

C++代码

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param array int整型vector
     * @return int整型vector
     */
    vector<int> FindGreatestSumOfSubArray(vector<int>& array) {
        //前缀和+动态规划
        int n = array.size();
        if (n <= 1)
            return array;

        //前缀和
        vector<int> presum(n + 1, 0);
        for (int i = 0; i < n; i++) {
            presum[i + 1] = presum[i] + array[i];
        }

        int pre = array[0];
        int max = array[0]; //最大的子数组和
        vector<int> list; //存放max对应的子数组的下标列表
        for (int i = 1; i < n; i++) {
            int p1 = array[i];
            int p2 = array[i] + pre;
            int cur = p1;
            if (cur < p2) {
                cur = p2;
            }

            if (max <= cur) {
                if (max < cur) {
                    list.clear();
                }
                max = cur;
                list.push_back(i);
            }

            pre = cur;
        }


        int maxLen = 0;
        int maxLenIdx = 0;
        for (int i = 0; i < list.size(); i++) {
            int idx = list[i];
            for (int j = 0; j <= idx; j++) {
                if (presum[idx + 1] - presum[j] == max) {
                    if (maxLen < idx + 1 - j) {
                        maxLen = idx + 1 - j;
                        maxLenIdx = idx;
                    }
                    break;
                }
            }
        }


        vector<int> ans(maxLen);
        for (int i = 0; i < maxLen; i++) {
            ans[i] = array[maxLenIdx - maxLen + 1 + i];
        }

        return ans;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/651480.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

课时138:变量进阶_变量实践_综合案例

2.1.3 综合案例 学习目标 这一节&#xff0c;我们从 免密认证、脚本实践、小结 三个方面来学习 免密认证 案例需求 A 以主机免密码认证 连接到 远程主机B我们要做主机间免密码认证需要做三个动作1、本机生成密钥对2、对端机器使用公钥文件认证3、验证手工演示 本地主机生成…

MyBatis报错:TypeException Could not set parameters for mapping问题解决

MyBatis报错&#xff1a;TypeException: Could not set parameters for mapping问题解决 问题收录 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{proper…

【详细介绍下PostgreSQL】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

考研数学|强化跟「张宇」还是「武忠祥」?看这一篇!

考研数学强化阶段是备考过程中非常关键的一环&#xff0c;它不仅要求学生巩固和深化基础知识&#xff0c;还要求学生能够灵活运用所学知识解决复杂问题。 在选择张宇老师或武忠祥老师的高数强化课时&#xff0c;你可以考虑以下几个方面。 首先每位学生都有自己独特的学习风格…

图片数据增强-resize(不同插值)、各种模糊

各种不同的模糊处理 import os import cv2def apply_blur_to_images(input_folder_path, output_folder_path):# 遍历文件夹下的所有文件for filename in os.listdir(input_folder_path):# 检查文件类型是否为图片if filename.endswith(.jpg) or filename.endswith(.jpeg) or …

探索演进:了解IPv4和IPv6之间的区别

探索演进&#xff1a;了解IPv4和IPv6之间的区别 在广阔的互联网领域中&#xff0c;设备之间的通信依赖于一组独特的协议来促进连接。前景协议中&#xff0c;IPv4&#xff08;Internet 协议版本 4&#xff09;和 IPv6&#xff08;Internet 协议版本 6&#xff09;是数字基础设施…

ThreadLocal简介

Thread类中&#xff0c;有个ThreadLocal.ThreadLocalMap 的成员变量。 ThreadLocalMap内部维护了Entry数组&#xff0c;每个Entry代表一个完整的对象&#xff0c;key是ThreadLocal本身&#xff0c;value是ThreadLocal的泛型对象值 public void set(T value) {Thread t Thread…

【Text2SQL 论文】IncSQL:通过增量式生成 action 序列来得到 SQL

论文&#xff1a;IncSQL: Training Incremental Text-to-SQL Parsers with Non-Deterministic Oracles ⭐⭐⭐ ICLR 2019&#xff0c;arXiv:1809.05054, Microsoft Research 一、论文速读 本文提出了 IncSQL&#xff0c;一个使用 Non-Deterministic Oracles 思路的增量式 Text…

问题记录_stm32“No target connected“

问题描述&#xff1a; 基于HAL库和stm32cubeMX生成的代码&#xff0c;烧录时出现如下报错窗口&#xff1a; 问题原因&#xff1a; stm32cubeMX生成代码时关闭了SWJ调试功能 解决方法&#xff1a; 在项目中找到__HAL_AFIO_REMAP_SWJ_DISABLE();并注释掉 然后短按复位键的…

电脑技巧:一台主机两个显示器的连接设置方法

目录 一、先与电脑连接好两个显示器 二、先来看看WIN7连接两个显示器设置方法 三、再来看看WIN10连接两个显示器设置方法 在日常办公场景中&#xff0c;为了提高工作效率和增强交互体验&#xff0c;常需一台电脑同时连接两个显示器&#xff0c;正如我们在营业厅常见到的那样…

这是你要找的可视化开发平台吗?【送源码】

今天着重推荐一款高效的拖拽式低代码数据可视化开发平台 它就是 goView 它将图表或页面元素封装为基础组件&#xff0c;无需编写代码即可制作数据大屏&#xff0c;减少心智负担。 介绍 框架&#xff1a;基于 Vue3 框架编写&#xff0c;使用 hooks 写法抽离部分逻辑&#xf…

Java通过Html(ftl模板)生成PDF实战, 可支持商用

Java通过Html(freemarker模板)生成PDF实战, 可支持商用 技术架构 springboot freemarker [pdfbox] flying-saucer-pdf 生成流程&#xff1a; freemarker: 根据数据填充ftl模板文件&#xff0c;得到包含有效数据的html文件&#xff08;包含页眉页脚页码的处理&#xff0c…

服务器软件架构演进

服务器软件架构演进 背景介绍阶段一&#xff1a;单机部署阶段二&#xff1a;应用与数据分离部署阶段三&#xff1a;启用缓存优化阶段四&#xff1a;启用应用服务器集群阶段五&#xff1a;数据库读写分离阶段六&#xff1a;启用反向代理及CDN加速阶段七&#xff1a;启用分布式文…

论文阅读--GroupViT

视觉之前做无监督分割的时候&#xff0c;经常使用grouping方法&#xff1a;如果有一些聚类的中心点&#xff0c;从这写点开始发散&#xff0c;把周围相似的点逐渐扩充成一个group&#xff0c;这个group就相当是一个segmentation mask 右边是grouping block&#xff0c;左边的两…

【Java】IdentityHashMap 的使用场景

文章目录 前言1. Druid 应用场景2. IdentityHashMap 特性3. IdentityHashMap 同步化4. IdentityHashMap 处理key为空值后记 前言 最近有兴趣看一下 Druid 连接池怎么做连接管理的&#xff0c;看到一个类 IdentityHashMap &#xff0c;这里记录一下使用场景。 1. Druid 应用场…

MySQL数据库语法(二)

一、数据库的创建 创建数据库CRATE DATABASE语法&#xff1a;CREATE DATABASE [IF NOT EXISTS]数据库名;功能&#xff1a;用给定的名字创建一个数据库如果数据库已经存在&#xff0c;发生一个错误。查看创建数据库&#xff1a;SHOW CREATE DATABASE <数据库名>&#xff…

通过键值对访问字典

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中&#xff0c;如果想将字典的内容输出也比较简单&#xff0c;可以直接使用print()函数。例如&#xff0c;要想打印dictionary字典&#xff…

【Redis】Widows 和 Linux 下使用 Redis

Redis 简述 1.缓存 缓存就是将数据存放在距离计算最近的位置以加快处理速度。缓存是改善软件性能的第一手段,现代 CPU 越来越快的一个重要因素就是使用了更多的缓存,在复杂的软件设计中,缓存几乎无处不在。大型网站架构设计在很多方面都使用了缓存设计。 2.Redis Redis …

神龙秘籍 无极神功 无极管理 真正的力量来自于自我内心。每个人都有潜力成为伟大的,只需要相信自己并发现内在的力量。

功夫熊猫中神龙秘籍的含义 在动画电影《功夫熊猫》中&#xff0c;神龙秘籍&#xff08;Dragon Scroll&#xff09;是一个具有重要象征意义的物品。影片通过神龙秘籍传达了几个深刻的主题和教训。 内在力量与自我发现&#xff1a;当阿宝&#xff08;Po&#xff09;最终打开神龙…

【物联网实战项目】STM32C8T6+esp8266/mqtt+dht11+onenet+uniapp

一、实物图 前端uniapp效果图&#xff08;实现与onenet同步更新数据&#xff09; 首先要确定接线图和接线顺序&#xff1a; 1、stm32c8t6开发板连接stlinkv2下载线 ST-LINK V2STM323.3V3.3VSWDIOSWIOSWCLKSWCLKGNDGND 2、ch340串口连接底座&#xff08;注意RXD和TXD的连接方式…