首页 > 其他分享 >最大子数组和

最大子数组和

时间:2024-06-07 09:26:25浏览次数:20  
标签:leftCount leftIndex 最大 nums int 数组 rightIndex rightCount

Problem: 53. 最大子数组和

目录

思路

双指针 但是用count保存双端的值 哪端count小哪端移动

解题方法

描述你的解题方法

复杂度

时间复杂度:

添加时间复杂度, 示例: $O(n)$

空间复杂度:

添加空间复杂度, 示例: $O(n)$

Code

// 这版性能一般
func maxSubArray(nums []int) int {
	resultArray := nums[:]
	leftIndex, rightIndex := 0, len(nums)-1
	// leftStart, rightStart := leftIndex, rightIndex
	leftCount, rightCount := nums[leftIndex], nums[rightIndex]

	for {
		// 当数组足够小直接退出,不用分
		if len(nums) == 1 {
			return nums[0]
		}

		// 判断下标距离, 如果下标相邻直接退出
		if leftIndex+1 == rightIndex {
			break
		}

		// 移动小的那端
		if leftCount < rightCount {
			leftIndex++
			if leftCount < 0 {
				resultArray = resultArray[leftIndex:]
				// 数组变化时leftIndex要缩小,leftIndex归为0
				rightIndex -= leftIndex
				leftIndex = 0
				leftCount = resultArray[leftIndex]
			} else {
				leftCount += resultArray[leftIndex]
			}
		} else {
			rightIndex--
			if rightCount < 0 {
				// 数组变化时rightIndex++
				resultArray = resultArray[:rightIndex+1]
				rightCount = resultArray[rightIndex]
			} else {
				rightCount += resultArray[rightIndex]
			}
		}

	}
	return max(leftCount+rightCount, max(leftCount, rightCount))
}

func max(a int, b int) int {
	if a > b {
		return a
	}
	return b
}

Code

// 将消耗比较大的切片去掉 性能已经不错了
func maxSubArray(nums []int) int {
	// 当数组足够小直接退出,不用分
	if len(nums) == 1 {
		return nums[0]
	}
	leftIndex, rightIndex := 0, len(nums)-1
	leftCount, rightCount := nums[leftIndex], nums[rightIndex]

	for {
		// 判断下标距离, 如果下标相邻直接退出
		if leftIndex+1 == rightIndex {
			break
		}
		// 移动小的那端
		if leftCount < rightCount {
			leftIndex++
			if leftCount < 0 {
				// 小于0舍弃掉并换成当前值
				leftCount = nums[leftIndex]
			} else {
				leftCount += nums[leftIndex]
			}
		} else {
			rightIndex--
			if rightCount < 0 {
				// 小于0舍弃掉并换成当前值
				rightCount = nums[rightIndex]
			} else {
				rightCount += nums[rightIndex]
			}
		}
	}
	return max(leftCount+rightCount, max(leftCount, rightCount))
}

func max(a int, b int) int {
	if a > b {
		return a
	}
	return b
}

标签:leftCount,leftIndex,最大,nums,int,数组,rightIndex,rightCount
From: https://www.cnblogs.com/sunchenxuan/p/18236501

相关文章

  • 122. 滑动窗口最大值(卡码网周赛第二十期(23年用友提前批笔试真题))
    122.滑动窗口最大值(卡码网周赛第二十期(23年用友提前批笔试真题))题目描述给定一个整数数组nums和一个整数k,k表示滑动窗口的大小。你需要找出每个滑动窗口中的最大值与最小值的差,并返回这些差的最大值。输入数组的长度为n,1<=n<=10000,数组中的每个元素范围为[-......
  • 代码随想录第2天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,数组总结
    题目:977.有序数组的平方思路:first.for循环,平方,然后sort排序,提交通过啊哈~|但时间复杂度大O(n+nlogn),->O(nlogn)的时间复杂度,题目进阶要求时间复杂度为O(n)second.双指针。题目为有序数组,包含负数,则平方后,最大值在数组的两头,则使用双指针进行,两个比较大小,大的存入新......
  • 字符数组VS字符串(一文搞懂有什么区别)
    当你在C++的程序中,经常会遇到两种字符串的表达方法,一种是以字符数组的方式,还有用string的,这二者到底有什么不同?下文将会帮彻底弄懂。因为许多函数参数当需要传入字符串的时候,有的代码中使用指向字符数组的指针来传递字符串,其实C++中传入字符数组,就相当于传入一个指向该数......
  • 数组array 和 &array的区别
    问题对于数组array和&array有什么区别呢?先说答案array:指向数组第一个数地址的指针&array:指向整个数组地址的指针所以直接打印的话,地址是一样的.但是如果+1的话,那么array是增加sizeof(int)大小,&array是增加sizeof(int)*array.size()测试#include<iost......
  • 记录工作中常用的 JS 数组相关操作
    工作中难免会遇到各种各样的数据结构,较为全面的了解数组操作,对于复杂数据结构的处理会非常有用且节省时间所以想在这里总结一下工作中常用的数组操作,都是一些非常基础的知识,大家看个乐就好~目录工作中常用的数组方法常见数组方法中的用法、以及坑slice()和splice()方法......
  • §2. 隐函数组
    掌握隐函数组的概念和隐函数组定理,会求隐函数组的偏导数。掌握反函数组定理,会求反函数组的偏导数。难点:求解隐函数组的偏导数(公式法或直接求偏导数然后解方程组)。重点习题:例1、例2、例3   卡尔·雅可比(CarlGustavJacobJacobi,1804~1851),德国数学家。1804年12月10日生......
  • 输出有10个元素的整型数组各元素的值
    (1)下标法编写程序:(2)指针法:将上面程序第7行和第10行的a[i]改为"*(a+i)"。(3)用指针变量指向数组元素编写程序:运行结果:对3种方法的比较:        方法(1)和(2)的执行效率是相同的。C++编译系统是将a[i]转换为*(a+1)处理的,对每个a[i]都分别计算地址a+ixd,然后访问该元素。第......
  • 数据转换-位串字节数组
    utils.c#include"utils.h"intBitstr2ByteArr(unsignedchar*bs,unsignedchar*ba,int*lba){inti,j;for(i=0,j=0;j<*lba;j++){ba[j]=0;for(intk=0;k<8;k++){if(bs[i]=='......
  • js 数组各种常见的操作
    JavaScript中的数组提供了多种操作方法,以下是一些常见的数组操作示例:1创建数组javascriptconstnumbers=[1,2,3,4,5];2访问数组元素javascriptconsole.log(numbers[0]);//输出:13修改数组元素javascriptnumbers[0]=10;4数组长度javascriptc......
  • java:数组和集合(例如ArrayList)的对比
    问题:为什么java里有了array还要有arrayList?(相类比的:python里只有list没有array)答案:因为arrayList是对array的补充,更灵活实用。数组和arrayList都是一维的,但数组可以通过下标直接访问,arrayList只能通过遍历访问;数组能存储基本类型和对象,arrayList只能存对象;数组长度不可变,array......