算法-连续项的最大和问题(最大子数组问题)三种不同解法

连续项的最大和问题

(1)暴力求解 时间复杂度 O(n^2)
(2)分治求解 时间复杂度 O(nlogn)
(3) 线性求解 时间复杂度 O(n)

C#代码

using System;
using System.Collections.Generic;namespace dataLearn
{class Program{static void Main(string[] args){List<int> list1 = new List<int> { -2, 4, -1, 3, 5, -6, 1, 2 };List<int> list2 = new List<int> { 4, 1, -3, 7, -1, -5, 3, -2 };List<int> list3 = new List<int> { -1, 6, 3, -4, -5, 8, -1, 7 };var max1 = MaxSumViolence(list1, 0, list1.Count - 1);Console.WriteLine(max1.start + " " + max1.end + " " + max1.value);var max2 = MaxSumViolence(list2, 0, list2.Count - 1);Console.WriteLine(max2.start + " " + max2.end + " " + max2.value);var max3 = MaxSumViolence(list3, 0, list3.Count - 1);Console.WriteLine(max3.start + " " + max3.end + " " + max3.value);var max4 = MaxSum(list1, 0, list1.Count - 1);Console.WriteLine(max4.start + " " + max4.end + " " + max4.value);var max5 = MaxSum(list2, 0, list2.Count - 1);Console.WriteLine(max5.start + " " + max5.end + " " + max5.value);var max6 = MaxSum(list3, 0, list3.Count - 1);Console.WriteLine(max6.start + " " + max6.end + " " + max6.value);}static (int start,int end,float value) MaxSumViolence(List<int> list ,int start,int end){int s = start, e = end;int max = list[start];for(int i=start;i<end+1;i++){int total = list[i];for(int j=i+1;j<end+1;j++){total += list[j];if(total>max){max = total;s = i;e = j;}}}return (s, e, max);}static (int start,int end,float value) MaxSum(List<int> list,int start,int end){if (start != end){int middle = (start + end) / 2;var leftMax = MaxSum(list, start, middle);var rightMax = MaxSum(list, middle + 1, end);var max = leftMax.value > rightMax.value ? leftMax : rightMax;int l = middle, r = middle + 1;float lvalue = list[middle];float rvalue = list[middle + 1];float temp = lvalue;for (int i = middle - 1; i >= start; i--){temp += list[i];if (temp > lvalue){l = i;lvalue = temp;}}temp = rvalue;for (int i = middle + 2; i <= end; i++){temp += list[i];if (temp > rvalue){r = end;rvalue = temp;}}if (max.value < lvalue + rvalue){return (l, r, lvalue + rvalue);}else return max;}elsereturn (start, start, list[start]);}}
}

c++ 代码
数据结构

#include <iostream>
class SubarrayResult{
public:int value;int left;int right;
public:SubarrayResult(int value,int left,int right):value(value),left(left),right(right){};SubarrayResult(){};friend std::ostream & operator<<(std::ostream &os,const SubarrayResult &result){return os<<"value:"<<result.value<<",left:"<<result.left<<",right:"<<result.right;}bool operator>=(const SubarrayResult & other){return this->value>= other.value;}
};

暴力求解法:时间复杂的O(n^2)

SubarrayResult brute_force_find_maximum_subarray(int *arr,int start,int end)
{int max_sum = INT_MIN;int sum = 0;int low = 0;int high = 0;for (int i = start; i < end+1; ++i) {sum = 0;for (int j = i; j < end+1 ; ++j) {sum += arr[j];if(sum>max_sum){max_sum = sum;low = i;high = j;}}}return SubarrayResult(max_sum,low,high);
}

分治递归求解法:
T(n)=2T(n/2)+θ(n)
时间复杂度(nlgn)

SubarrayResult find_crossing_subarray(int *arr,int start,int end ,int middle);SubarrayResult find_maximum_subarray(int *arr,int start,int end)
{if(start == end)return SubarrayResult(arr[start],start,end);else{int middle = (start + end)/2;SubarrayResult left_result = find_maximum_subarray(arr,start,middle);SubarrayResult right_result = find_maximum_subarray(arr,middle+1,end);SubarrayResult cross_result = find_crossing_subarray(arr,start,end,middle);if(left_result >= right_result && left_result >= cross_result)return left_result;else if(right_result >= left_result && right_result >= cross_result)return right_result;else return cross_result;}
}SubarrayResult find_crossing_subarray(int *arr,int start,int end, int middle)
{int left_sum = INT_MIN,right_sum = INT_MIN;int sum = 0,max_left = 0, max_right = 0;for (int i = middle; i >= start ; i--) {sum += arr[i];if(sum>left_sum){left_sum = sum;max_left = i;}}sum = 0;for (int i = middle + 1; i < end+1; ++i) {sum += arr[i];if(sum>right_sum){right_sum = sum;max_right = i;}}return SubarrayResult(left_sum+right_sum,max_left,max_right);
}

线性求解法:
时间复杂度O(n)

SubarrayResult iterative_find_maximum_subarray(int *arr,int start,int end)
{int left = 0,right = 0,current_low = 0,current_high = 0;int sum = INT_MIN ,max_sum = INT_MIN;for (int i = start; i < end+1; ++i) {current_high = i;if(sum > 0){sum += arr[i];}else{current_low = i;sum = arr[i];}if(sum > max_sum){max_sum = sum;left = current_low;right = current_high;}}return SubarrayResult(max_sum,left,right);
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET 5 尝鲜 - 开源项目TerminalMACS WPF管理端支持.NET 5

点击上方“Dotnet9”添加关注哦聊天界面设计TerminalMACS一个使用 Prism 作为模块化框架、基于多个开源控件库作为UI控件选择、集成开源 UI 界面设计的 .NET 5 WPF 客户端项目。项目名称&#xff1a;TerminalMACS WPF管理端项目开源地址&#xff1a;Github&#xff1a;https://…

算法-排序-插入排序

插入排序 特点&#xff1a;原址排序&#xff0c;比较排序&#xff0c;&#xff08;最坏的情况&#xff09;时间复杂度O&#xff08;n^2&#xff09; #include <iostream>void insertion_sort(int *arr,int start,int end) {for (int i start1; i < end1; i) {int k…

MongoDB via Dotnet Core数据映射详解

用好数据映射&#xff0c;MongoDB via Dotnet Core开发变会成一件超级快乐的事。一、前言MongoDB这几年已经成为NoSQL的头部数据库。由于MongoDB free schema的特性&#xff0c;使得它在互联网应用方面优于常规数据库&#xff0c;成为了相当一部分大厂的主数据选择&#xff1b;…

算法-排序-归并排序

归并排序 特点&#xff1a;非原址排序&#xff0c;比较排序&#xff0c;时间复杂度O&#xff08;nlgn&#xff09; 稳定 // // Created by 许加权 on 2021/6/18. //#include <iostream> void merge_sort(int *arr,int start,int end) {if(start < end){int middle …

FreeSql.Generator命令行代码生成器是如何实现的

目录FreeSql介绍FreeSql.GeneratorRazorEngine.NetCore源码解析FreeSql.ToolsFreeSqlFreeSql 是功能强大的对象关系映射技术(O/RM)&#xff0c;支持 .NETCore 2.1 或 .NETFramework 4.0 或 Xamarin。有一个强大的ORM&#xff0c;也方便我们开发一个代码生成器。一般情况下&…

算法-排序-选择排序

选择排序 特点&#xff1a;原址排序&#xff0c;比较排序&#xff0c;时间复杂度O&#xff08;n^2&#xff09; // // Created by 许加权 on 2021/6/19. //#include <iostream>void selection_sort(int *arr,int start,int end) {for (int i start 1; i < end1; i…

.Net Core Configuration Etcd数据源

前言.Net Core为我们提供了一套强大的Configuration配置系统&#xff0c;使用简单扩展性强。通过这套配置系统我们可以将Json、Xml、Ini等数据源加载到程序中,也可以自己扩展其他形式的存储源。今天我们要做的就是通过自定义的方式为其扩展Etcd数据源操作。何为Etdc在使用etcd之…

算法-二分查找

二分查找 特点&#xff1a; T(n) T(n/2 - 1) c 时间复杂度O&#xff08;lgn) 前提&#xff1a;需要已排序的集合 int binary_search(int *arr,int start,int end,int key) {if(start<end){int middle (startend)/2;if(arr[middle] key) return middle;if(key<arr[m…

Java IDEA断点调试

断点调试(debug) 断点调试应用案例 01&#xff1a; package Assign;public class Debug01 {public static void main(String[] args) {int sum 0;for (int i 0;i<5;i){sumi;System.out.println(i);System.out.println(sum);}System.out.println("continue");} …

.NET Core请求控制器Action方法正确匹配,但为何404?

【导读】提前预祝各位端午节快乐。有时候我们会发现方法名称都正确匹配&#xff0c;但就是找不到对应请求接口&#xff0c;所以本文我们来深入了解下何时会出现接口请求404的情况。匹配控制器Action方法&#xff08;404&#xff09;首先我们创建一个web api应用程序&#xff0c…

布斯乘法以及带符号数的运算

乘法理解 对于最熟悉的十进制乘法很最基本的运算原理就是一个乘数乘以另一个乘数的个位、十位、百位数字然后求和。比如 放到二进制来看其实它也是这样的&#xff0c;多位数的乘法就是一个乘数乘上另一个乘数的各位求和。那么&#xff1a; 布斯算法及原理 原理 已经知道两…

算法-排序-冒泡排序

冒泡排序 特点&#xff1a;原址排序&#xff0c;比较排序 时间复杂度O&#xff08;n^2) void bubble_sort(int *arr,int start,int end) {for (int i start; i < end; i) {for (int j end; j >i ; j--) {if(arr[j-1]>arr[j]){int temp arr[j];arr[j] arr[j-1];a…

C++重载输出操作符<<,为什么要返回引用

针对&#xff1a;ostream & operator <<(ostream & os, const ClassType &object) 说明几点&#xff1a; 1.第一个形参为对ostream对象的引用&#xff0c;在该对象上将产生输出&#xff0c;ostream为非const&#xff0c;因为写入到流会改变流的状态&#x…

angular 接入 IdentityServer4

angular 接入 IdentityServer4Intro最近把活动室预约的项目做了一个升级&#xff0c;预约活动室需要登录才能预约&#xff0c;并用 IdentityServer4 做了一个统一的登录注册中心&#xff0c;这样以后就可以把其他的需要用户操作的应用统一到 IdentityServer 这里&#xff0c;这…

算法-计算逆序对个数

求逆序对的个数 特点&#xff1a;利用归并排序中合并的步骤&#xff0c;计算逆序对 时间复杂度O&#xff08;nlgn&#xff09; int merge_inversion(int *arr,int start,int end,int middle); int count_inversion(int *arr,int start,int end) {if(start<end){int middle…

主机Redis服务迁移到现有Docker Overlay网络

“《麻雀虽小&#xff0c;五脏俱全》之主机现有Redis服务迁移到Docker Swarm Overlay网络&#xff0c;并搭建高可用容器集群。hello, 好久不见&#xff0c;之前文章记录了一个实战的2C分布式项目的改造过程&#xff0c;结果如下&#xff1a;其中Redis并未完成容器化改造&#x…

堆排序(包含最大堆和最小堆)

堆排序&#xff08;包含最大堆和最小堆&#xff09; 堆排序 时间复杂度nlgn&#xff0c;原址排序。 通用函数 int parent(int i) {return (i - 1) >> 1; } int left(int i) {return (i << 1) 1; } int right(int i) {return (i << 1) 2; }最大堆排序 v…

Java控制结构

控制结构 程序流程控制介绍 顺序控制 分支控制if-else 单分支 案例演示 01: import java.util.Scanner; public class IfWorkDemo {public static void main(String[] args){Scanner myScanner new Scanner(System.in);System.out.println("input your age");int…

.Net Core Configuration源码探究

前言上篇文章我们演示了为Configuration添加Etcd数据源&#xff0c;并且了解到为Configuration扩展自定义数据源还是非常简单的&#xff0c;核心就是把数据源的数据按照一定的规则读取到指定的字典里&#xff0c;这些都得益于微软设计的合理性和便捷性。本篇文章我们将一起探究…

最大堆实现优先队列

最大堆实现优先队列 头文件 #include "heap_sort.h" #include "stdexcept" #include <iostream> class MaxHeapPriorityQueue { public:int heap_size; private:int capacity;int *array;void increase_key(int key,int index); public:void inser…