数据结构和算法面试题:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

简介: 数据结构和算法面试题:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

数据结构和算法面试题:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

简介:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

该算法的实现思路如下:

  1. 使用一个变量ans存储最终的答案,使用一个变量cur存储当前的连续子数组和。
  2. 遍历整个数组,对于每一个数字,更新cur为它自身和(cur + nums[i])之间的较大值。如果cur大于ans,则将ans更新为cur。
  3. 遍历完数组后,返回ans作为最大子数组和。

下面是使用C++实现查找最大子数组和的代码,并附带详细注释:

#include <iostream>
#include <vector>
using namespace std;
int maxSubArray(vector<int>& nums) {
    int ans = nums[0]; // 初始化最终答案
    int cur = nums[0]; // 初始化当前连续子数组
    for (int i = 1; i < nums.size(); ++i) {
        cur = max(nums[i], cur + nums[i]); // 更新当前连续子数组和
        ans = max(ans, cur); // 更新最终答案
    }
    return ans;
}
int main() {
    vector<int> nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
    int ans = maxSubArray(nums);
    cout << ans << endl; // 6
    return 0;
}

该算法遍历整个数组,维护了两个变量ans和cur,其中ans表示目前找到的最优连续子序列的和,cur是num[i]为结尾的连续子数组的和。在每次遍历中,用当前数值num[i]与num[i]+cur之间的较大值更新cur并求出当前子数组msum[i]的和,将其与ans作比较,并记录在ans中;最终返回ans作为答案。由于只有一层循环,该算法的时间复杂度为 O(n)。

  • java版本
import java.util.Arrays;
public class Main {
    public static int maxSubArray(int[] nums) {
        int ans = nums[0]; // 初始化最终答案
        int cur = nums[0]; // 初始化当前连续子数组
        for (int i = 1; i < nums.length; ++i) {
            cur = Math.max(nums[i], cur + nums[i]); // 更新当前连续子数组和
            ans = Math.max(ans, cur); // 更新最终答案
        }
        return ans;
    }
    public static void main(String[] args) {
        int[] nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
        int ans = maxSubArray(nums);
        System.out.println(ans); // 6
    }
}
相关文章
【Java集合类面试二十六】、介绍一下ArrayList的数据结构?
ArrayList是基于可动态扩展的数组实现的,支持快速随机访问,但在插入和删除操作时可能需要数组复制而性能较差。
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
760 3
|
算法 前端开发 Java
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
这篇文章总结了单链表的常见面试题,并提供了详细的问题分析、思路分析以及Java代码实现,包括求单链表中有效节点的个数、查找单链表中的倒数第k个节点、单链表的反转以及从尾到头打印单链表等题目。
334 1
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
|
人工智能 算法
第一周算法设计与分析:C : 200和整数对之间的情缘
这篇文章介绍了解决算法问题"200和整数对之间的情缘"的方法,通过统计数组中每个数模200的余数,并计算每个同余类中数的组合数来找出所有满足条件的整数对(i, j),使得\( A_i - A_j \)是200的整数倍。
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
算法
【算法】二分查找(整数二分和浮点数二分)
算法学习——二分查找(整数二分和浮点数二分)
568 0
【算法】二分查找(整数二分和浮点数二分)
|
Python
【面试题解答】一个有序数组 nums ,原地删除重复出现的元素
【面试题解答】一个有序数组 nums ,原地删除重复出现的元素
294 0
|
Java Android开发 Kotlin
Android面试题:App性能优化之Java和Kotlin常见的数据结构
Java数据结构摘要:ArrayList基于数组,适合查找和修改;LinkedList适合插入删除;HashMap1.8后用数组+链表/红黑树,初始化时预估容量可避免扩容。SparseArray优化查找,ArrayMap减少冲突。 Kotlin优化摘要:Kotlin的List用`listOf/mutableListOf`,Map用`mapOf/mutableMapOf`,支持操作符重载和扩展函数。序列提供懒加载,解构用于遍历Map,扩展函数默认参数增强灵活性。
437 0
|
存储 算法 大数据
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
|
存储 SQL 算法
LeetCode 83题:删除排序链表中的重复元素【面试】
LeetCode 83题:删除排序链表中的重复元素【面试】