首页 > 其他分享 >最小子段和

最小子段和

时间:2024-05-15 16:32:10浏览次数:17  
标签:arr right int sum num 小子 left

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 10
#define MAX_RANDOM_NUM  20

/**
 * 求最大子段和
 *      情况1:左子段长
 *      情况2:右子段长
 *      情况3:右子段一部分和左子段一部分相连长
 * @param arr        数组
 * @param left       左下标
 * @param right      右下标
 * @return
 */
int maxSubNum(int *arr, int left, int right) {
    int sum = 0;
    if (left == right) {
        sum = arr[left];
    } else {
        //获取左右子段的最大和
        int center = (left + right) >> 1;
        int leftSum = maxSubNum(arr, left, center);
        int rightSum = maxSubNum(arr, center + 1, right);
        //获取情况3的长度
        //左子段 从右到左最大的和
        int s1 = 0;
        int tmpLeftSum = 0;
        for (int i = center; i >= left; i--) {
            tmpLeftSum += arr[i];
            if (tmpLeftSum > s1) {
                s1 = tmpLeftSum;
            }
        }
        //右子段  从左到右最大的和
        int s2 = 0;
        int tmpRightSum = 0;
        for (int i = center + 1; i <= right; i++) {
            tmpRightSum += arr[i];
            if (tmpRightSum > s2) {
                s2 = tmpRightSum;
            }
        }
        //情况3将两段相加获取情况3的和
        sum = s1 + s2;

        //判断3种情况 获取最大和
        if (sum < leftSum) {
            sum = leftSum;
        }
        if (sum < rightSum) {
            sum = rightSum;
        }
    }
    return sum;
}

//给数组进行赋值
void random(int *arr) {
    //设置随机数种子
    srand((unsigned int) time(NULL));
    printf("生成的随机数组: ");
    for(int i = 0; i < N; i++){
        int num = (rand() % (MAX_RANDOM_NUM)) + 1;
        //随机正负号
        if (rand() % 2) {
            //负数
            num = -num;
        }
        //赋值
        printf(" %d ", num);
        arr[i] = num;
    }
    printf("\n");
}

int main() {
    int *arr = (int *) malloc(N * sizeof(int));
    random(arr);
    printf("最大子段和: %d",maxSubNum(arr,0, N - 1));
    return 0;
}

标签:arr,right,int,sum,num,小子,left
From: https://www.cnblogs.com/Liu--blog/p/18194131

相关文章

  • 三十分钟入门基础Go(Java小子版)
    前言Go语言定义Go(又称Golang)是Google的RobertGriesemer,RobPike及KenThompson开发的一种静态、强类型、编译型语言。Go语言语法与C相近,但功能上有:内存安全,GC,结构形态及CSP-style并发计算。适用范围本篇文章适用于学习过其他面向对象语言(Java、Php),但没有学过......
  • (2/60)有序数组平方、长度最小子数组、螺旋矩阵
    有序数组的平方leetcode:977.有序数组的平方给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。暴力法思路遍历数组,元素原地替换为自身平方值。将数组进行排序。复杂度分析时间复杂度:O(N+logN)空间复杂度:O(1)注......
  • k8s flannel获取小子网
    flannelv0.11.0kube-flannel-ds-amd64main.goflanneld启动时设置kube-subnet-mgr参数是true,表示连接kube-apiserver来分配subnet,而不是直连etcd。启动时从挂载的configmapkube-flannel-cfg中读取Pod网段和后端类型。flanneld从kube-controller-manager全局分配的Nodes......
  • 论文研读_通过具有可扩展的小子种群的协方差矩阵适应性进化策略解决大规模多目标优化
    论文研读_通过具有可扩展的小子种群的协方差矩阵适应性进化策略解决大规模多目标优化问题创新点随着目标或决策变量的数量增加,收敛性和多样性之间的冲突变得更为严重,因此在它们之间取得平衡变得越来越困难。此时S3-CMA-ES,它使用一系列子种群来近似LSMOPs的PFs,并强调不同子种......
  • Python速成脚本小子(20道基础题)
    Python速成脚本小子(20道基础题)基础介绍当今社会,编程已经成为了一种必备的技能。而Python,作为一门高效简洁的编程语言,备受大家的喜爱。Python语言易学易用,非常适合初学者入门,同时也是各大公司招聘的必备技能之一。那么,如何快速入门Python,成为一个Python速成脚本小子呢?以下是一......
  • 那些穷小子门
    薛仁贵被绣球砸到,天赐良缘,谁知岳父嫌弃他家穷!.-影视综视频-搜狐视频.薛仁贵:薛仁贵被绣球砸到,天赐良缘,谁知岳父嫌弃他家穷! 莫欺少年穷 ......
  • 【从零开始】Docker Desktop:听说你小子要玩我
    前言......
  • 算法题-第K个小子串
    第K小子串输入一个字符串s,s由小写英文字母组成,保证s长度小于等于5000并且大于等于1。在s的所有不同的子串中,输出字典序第k小的字符串。字符串中任意个连续的字符组成的子序列称为该字符串的子串。字母序表示英文单词在字典中的先后顺序,即先比较第一个字母,若第一个字......
  • 三十分钟入门基础Go(Java小子版)
    作者:京东科技韩国凯前言Go语言定义​​Go(又称Golang)是Google的RobertGriesemer,RobPike及KenThompson开发的一种静态、强类型、编译型语言。Go语言语法与C相近......
  • 三十分钟入门基础Go(Java小子版)
    作者:京东科技韩国凯前言Go语言定义Go(又称Golang)是Google的RobertGriesemer,RobPike及KenThompson开发的一种静态、强类型、编译型语言。Go语言语法与C相近......