算法:分治法-力扣题最大子数组和

文章目录

  • 概念
  • 应用
  • 步骤
  • 实现过程-快速排序为例
    • 具体实现步骤:
    • 代码实现:
  • 力扣-2586统计范围内的元音字符
    • 题解

概念

分治法是一种算法思想,其核心思想是将一个大问题分割成若干个小问题来解决。通过对小问题的分别计算,最终得到大问题的解。

应用

分治法的常见应用包括排序、查找、计算几何、图形处理等。它的优点在于可以大大降低计算量,提高程序运行效率。同时,分治法的模型较为简单,易于理解。

步骤

分治法的具体实现通常分为三个步骤:

1.分割:将原问题划分为若干个规模较小的子问题。

2.解决:递归地解决划分出来的子问题。如果子问题足够小,则直接用简单的方法求解。

3.合并:将已解决的子问题的解合并成原问题的解。

实现过程-快速排序为例

下面以快速排序为例详细介绍分治法的实现过程:

快速排序:

快速排序是一种常用的排序算法,其基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均小于另一部分的关键字,然后再分别对这两部分记录递归地进行排序,以达到整个序列有序的目的。

具体实现步骤:

1.选取基准值:从数列中挑出一个元素,作为基准值。

2.分割:将数列中所有小于等于基准值的元素放到基准值前面,所有大于基准值的元素放到基准值后面(相当于将问题分割为两部分)。

3.解决:递归地对分割后的两部分进行快速排序。

4.合并:不需要进行合并操作,因为分割后两部分是相互独立的。

代码实现:

void quickSort(int arr[], int left, int right) {int i = left, j = right;int tmp;int pivot = arr[(left + right) / 2];/* partition */while (i <= j) {while (arr[i] < pivot)i++;while (arr[j] > pivot)j--;if (i <= j) {tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;i++;j--;}};/* recursion */if (left < j)quickSort(arr, left, j);if (i < right)quickSort(arr, i, right);
}

分治法是一种非常实用的算法思想,在处理大数据量、复杂问题时,分治法能够提供有效的解决方案。同时,分治法也有其局限性,例如需要额外的空间来存储数据和递归调用开销。因此,在实际应用过程中,需要根据具体情况选择分治法或其他算法思想来解决问题。

力扣-2586统计范围内的元音字符

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:

输入:nums = [1]
输出:1
示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104

题解

连续子序列的最大和主要由这三部分子区间里元素的最大和得到:

第 1 部分:子区间 [left, mid];
第 2 部分:子区间 [mid + 1, right];
第 3 部分:包含子区间 [mid , mid + 1] 的子区间,即 nums[mid] 与 nums[mid + 1] 一定会被选取。
对这三个部分求最大值即可。

说明:考虑第 3 部分跨越两个区间的连续子数组的时候,由于 nums[mid] 与 nums[mid + 1] 一定会被选取,可以从中间向两边扩散,扩散到底 选出最大值
在这里插入图片描述

public class Solution { // 定义一个名为 Solution 的公开类  public int maxSubArray(int[] nums) { // 定义一个公开方法 maxSubArray,输入参数为一个整数数组 nums  int len = nums.length; // 获取输入数组的长度  if (len == 0) { // 如果数组长度为0  return 0; // 返回0,因为不存在子数组  }  return maxSubArraySum(nums, 0, len - 1); // 否则,调用 maxSubArraySum 方法求解  }  // 定义一个私有方法 maxCrossingSum,输入参数为一个整数数组 nums、左边界 left、中间点 mid 和右边界 right  private int maxCrossingSum(int[] nums, int left, int mid, int right) {  // 一定会包含 nums[mid] 这个元素  int sum = 0; // 初始化 sum 为0,用于保存交叉子数组的和  int leftSum = Integer.MIN_VALUE; // 初始化 leftSum 为最小整数值,用于保存左半部分最大子数组的和  // 左半边包含 nums[mid] 元素,最多可以到什么地方  // 走到最边界,看看最值是什么  // 计算以 mid 结尾的最大的子数组的和  for (int i = mid; i >= left; i--) {  sum += nums[i]; // 将当前元素加入 sum  if (sum > leftSum) {  leftSum = sum; // 如果 sum 大于 leftSum,则更新 leftSum  }  }  sum = 0; // 重置 sum 为0,用于保存右半部分交叉子数组的和  int rightSum = Integer.MIN_VALUE; // 初始化 rightSum 为最小整数值,用于保存右半部分最大子数组的和  // 右半边不包含 nums[mid] 元素,最多可以到什么地方  // 计算以 mid+1 开始的最大的子数组的和  for (int i = mid + 1; i <= right; i++) {  sum += nums[i]; // 将当前元素加入 sum  if (sum > rightSum) {  rightSum = sum; // 如果 sum 大于 rightSum,则更新 rightSum  }  }  return leftSum + rightSum; // 返回左右两个最大子数组和之和  }  // 定义一个私有方法 maxSubArraySum,输入参数为一个整数数组 nums、左边界 left 和右边界 right  private int maxSubArraySum(int[] nums, int left, int right) {  if (left == right) { // 如果左边界和右边界相等,说明只有一个元素  return nums[left]; // 直接返回这个元素的值作为最大子数组和  }  int mid = left + (right - left) / 2; // 计算中间点 mid,用于进行分治处理  return max3(maxSubArraySum(nums, left, mid), // 分治处理:对左半部分递归求解最大子数组和  maxSubArraySum(nums, mid + 1, right), // 分治处理:对右半部分递归求解最大子数组和  maxCrossingSum(nums, left, mid, right)); // 分治处理:求解穿过 mid 的最大交叉子数组和  }  // 定义一个私有方法 max3,输入参数为三个整数 num1、num2 和 num3  private int max3(int num1, int num2, int num3) { // 求三个数中的最大值  return Math.max(num1, Math.max(num2, num3)); // 使用 Math.max 方法求得最大值并返回  }  
}

时间复杂度:O(Nlog⁡N),每一层需要遍历一遍数组(或者数组的一半、四分之一);

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

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

相关文章

SEO是什么?独立站如何进行SEO优化

创建一个独立网站并不是难事&#xff0c;但要做好独立网站并进行SEO优化以增加自然流量可能是一个不小的挑战。今天&#xff0c;我们将分享一些关于独立网站SEO优化的技巧&#xff0c;并详细探讨如何提升流量。 在本文中&#xff0c;我们将主要关注谷歌SEO&#xff0c;但请不要…

2000-2022年上市公司专利申请、创新绩效数据

2000-2022年上市公司专利申请、创新绩效数据 1、时间&#xff1a;2000-2022年 2、指标&#xff1a;年份、股票代码、股票简称、行业名称、行业代码、省份、城市、区县、行政区划代码、城市代码、区县代码、首次上市年份、上市状态、专利申请总量、发明专利申请总量、实用新型…

Linux--vim

文章目录 Vim的介绍Vim的几种模式命令模式下的基本操作批量化注释Vim的简单配置使用插件 Vim的介绍 Vim是一个强大的文本编辑器&#xff0c;是从vi编辑器发展而来的&#xff0c;在vi编辑器的基础上进行了改进和拓展&#xff0c;具有强大的特性和功能。 Vim是一个自由开源软件&…

技术分享 | app自动化测试(Android)--显式等待机制

WebDriverWait类解析 WebDriverWait 用法代码 Python 版本 WebDriverWait( driver,timeout,poll_frequency0.5,ignored_exceptionsNone) 参数解析&#xff1a; driver&#xff1a;WebDriver 实例对象 timeout: 最长等待时间&#xff0c;单位秒 poll_frequency: 检测的间…

MySQL 8.0 Clone Plugin 详解

文章目录 前言1. 克隆插件安装2. 克隆插件的使用2.1 本地克隆2.2 远程克隆 3. 克隆任务监控4. 克隆插件实现4.1 Init 阶段4.2 File Copy4.3 Page Copy4.4 Redo Copy4.5 Done 5. 克隆插件的限制6. 克隆插件与 Xtrabackup 的异同7. 克隆插件相关参数后记 前言 克隆插件&#xff…

Go uuid库介绍

简介&#xff1a; 在现代软件开发中&#xff0c;全球唯一标识符&#xff08;UUID&#xff09;在许多场景中发挥着重要的作用。UUID是一种128位的唯一标识符&#xff0c;它能够保证在全球范围内不重复。在Go语言中&#xff0c;我们可以使用第三方库github.com/google/uuid来方便…

python 之 集合的相关知识

文章目录 1. 创建集合使用花括号 {}使用 set() 函数 2. 集合的特点3. 集合操作添加元素删除元素 4. 集合运算5. 不可变集合总结 在 Python 中&#xff0c;集合&#xff08;Set&#xff09;是一种无序且不重复的数据集合。它是由一组唯一元素组成的。下面是关于集合的一些基本知…

【云原生】使用nginx反向代理后台多服务器

背景 随着业务发展&#xff0c; 用户访问量激增&#xff0c;单台服务器已经无法满足现有的访问压力&#xff0c;研究后需要将后台服务从原来的单台升级为多台服务器&#xff0c;那么原来的访问方式无法满足&#xff0c;所以引入nginx来代理多台服务器&#xff0c;统一请求入口…

Leetcode-234 回文链表

我的解法&#xff1a;使用栈&#xff0c;定义了len略微复杂&#xff0c;拿链表的后半部分和前半部分比较即可&#xff0c;没必要全部比较 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* List…

369-HI-R-M-0-0-0-E 数字化转型如何改变DCS和SCADA

369-HI-R-M-0-0-0-E 数字化转型如何改变DCS和SCADA 高瞻远瞩的过程制造商正在投资数字化转型&#xff0c;而DCS和SCADA最终将成为这些努力的一部分。因此&#xff0c;它们与所有其他流程制造技术一起发展。DCS和SCADA系统的变化符合自动化金字塔正在进行的转变&#xff0c;它也…

Linux驱动开发——USB设备驱动

目录 一、 USB 协议简介 二、 Linux USB 驱动 三、 USB 设备驱动实例 一、 USB 协议简介 USB(Universal Serial Bus&#xff0c;通用串行总线)正如它的名字一样&#xff0c;是用来连接PC外设的一种通用串行总线&#xff0c;即插即用和易扩展是它最大的特点。所谓即插即用&am…

GPT-4V:AI在医疗领域的应用

OpenAI最新发布的GPT-4V模型为ChatGPT增添了语音和图像功能&#xff0c;为用户提供了更多在日常生活中使用ChatGPT的方式。这次更新将为用户带来更加便捷、直观的交互体验&#xff0c;用户可以直接通过拍照上传图片&#xff0c;并提出相关问题。OpenAI的最终目标是构建一个安全…

MYSQL多表联查on和where的区别

目录 一、背景 二、探究 2.1、统计每个班级中女生的数量 错误的写法 查询结果 正确的写法 查询结果 2.2、只统计"一班"的学生数量 错误的写法 查询结果 正确的写法 查询结果 三、总结 一、背景 在一次对数据进行统计的时候&#xff0c;需要对两张表进行…

【vite】vite.defineConfig is not a function/npm无法安装第三方包问题

当使用vite命令 npm init vite-app 项目名称时配置 import vue from vitejs/plugin-vueexport default defineConfig({plugins: [vue()] })会报错vite.defineConfig is not a function 还有就是npm下载的时候也会报错 原因vite插件vitejs/plugin-vue和vite版本问题 解决 调…

Intel oneAPI笔记(3)--jupyter官方文档(SYCL Program Structure)学习笔记

前言 本文是对jupyterlab中oneAPI_Essentials/02_SYCL_Program_Structure文档的学习记录&#xff0c;包含对Device Selector、Data Parallel Kernel、Host Accessor、Buffer Destruction、的介绍&#xff0c;最后还有一个小关于向量&#xff08;Vector&#xff09;加法的实例 …

zookeeper:启动原理

主类&#xff1a; QuorumPeerMain, 其中调用了main对象的initializeAndRun方法&#xff0c; 首先定义了QuorumPeerConfig对象&#xff0c;然后调用了parse方法&#xff0c;parse方法代码如下&#xff1a; 其中调用的parseProperties方法的代码如下&#xff1a; 可以看到&am…

Linux 实现原理 — NUMA 多核架构中的多线程调度开销与性能优化

前言 NOTE&#xff1a;本文中所指 “线程” 均为可执行调度单元 Kernel Thread。 NUMA 体系结构 NUMA&#xff08;Non-Uniform Memory Access&#xff0c;非一致性存储器访问&#xff09;的设计理念是将 CPU 和 Main Memory 进行分区自治&#xff08;Local NUMA node&#x…

【GO】项目import第三方的依赖包

目录 一、导入第三方包 1.执行命令 2.查看go环境变量参数 3.查看go.mod文件的变化情况 二、程序里如何import 1. import依赖包 2. 程序编写 本次学习go如果依赖第三方的包&#xff0c;并根据第三方的包提供的接口进行编程&#xff0c;这里需要使用go get命令。下面将go…

无人机红外相机的畸变矫正

在项目开展过程中&#xff0c;发现大疆M30T的红外相机存在比较明显的畸变问题&#xff0c;因此需要对红外图像进行畸变矫正。在资料检索过程中&#xff0c;发现对红外无人机影像矫正的资料较少&#xff0c;对此&#xff0c;我从相机的成像原理角度出发&#xff0c;探索出一种效…

Redis主从配置和哨兵模式

主从简介 1、主从 – 用法 像MySQL一样&#xff0c;redis是支持主从同步的&#xff0c;而且也支持一主多从以及多级从结构。 主从结构&#xff0c;一是为了纯粹的冗余备份&#xff0c;二是为了提升读性能&#xff0c;比如很消耗性能的SORT就可以由从服务器来承担。 redis的主…