`
mwei
  • 浏览: 123981 次
  • 性别: Icon_minigender_1
  • 来自: 抽象空间
社区版块
存档分类
最新评论

求数组的平衡点

    博客分类:
  • java
 
阅读更多
原文见:http://www.iteye.com/topic/600079
平衡点:比如int[] numbers = {1,3,5,7,8,25,4,20}; 25前面的总和为24,25后面的总和也是24,25这个点就是平衡点;假如一个数组中的元素,其前面的部分等于后面的部分,那么这个点的位序就是平衡点
要求:返回任何一个平衡点
思路:数组两边同时求和,只需一次遍历数组,统计求和次数count,如果count为数组长度-1,那么存在平衡点。
写篇日记,记录一下自己的代码:
bug是,{1,0,0,0,1}存在多个平衡点,下面的程序只能找到中间的0;{1,0,0,1}有2个平衡点,下面的程序却找不到。其他的bug还没有发现。
public static void getBalancePoint(int[] arg){
		if(arg==null){
			System.out.println("array is null...");
			return;
		}
		if(arg.length<3){
			System.out.println("array's length is smaller than 3...no balance...");
			return;			
		}
		if(arg.length==3){
			if(arg[0]==arg[2]){
				System.out.println("array's balance is : "+arg[1]);
			}else{
				System.out.println("array has no balance...");
			}
			return;
		}
		int totalHead=0; //前部分总和(假设数组下标小的部分表示前)
		int totalEnd=0; //后部分总和
		int head=0; //前部分的数组下标
		int end=arg.length-1; //后部分的数组下标
		boolean addHead=true; //是否累加前部分
		boolean addEnd=true; //是否累加后部分
		int addCount=0; //总共累加次数
		while(head<end){
			if(addHead){ //前部分依次累加
				totalHead+=arg[head];
				addCount++;
			}
			if(addEnd){ //后部分依次累加
				totalEnd+=arg[end];
				addCount++;
			}
			if(totalHead<totalEnd){ //只允许前部分累加
				head++;
				addHead=true;
				addEnd=false;
			}else if(totalHead>totalEnd){ //只允许后部分累加
				end--; 
				addHead=false;
				addEnd=true;
			}else{ //前后同时累加
				head++;
				end--;
				addHead=true;
				addEnd=true;
			}
		} //end while
		if(addCount==(arg.length-1)){ //存在平衡点
			System.out.println("array's balance is : "+arg[head]);
		}else{
			System.out.println("array has no balance...");
		}
	}



分享到:
评论

相关推荐

    balance-points:查找数组的平衡点

    查找数组的平衡点。 平衡点是索引的左侧等于索引的右侧的位置。 此函数返回平衡点索引数组。 安装 npm install balance-points bower install balance-points 用法 const balancepoints = require ( 'balance-...

    浅析jquery数组删除指定元素的方法:grep()

    因此,在选择使用`grep()`或`splice()`时,需要根据实际情况考虑性能与需求的平衡。 最后,为了更深入理解如何使用`grep()`方法,我们也可以参考权威的开发文档,例如W3Schools中的`grep()`函数的描述和示例。这类...

    将升序数组转化为平衡二叉搜索树

    本知识点主要探讨如何将一个升序数组转化为一棵平衡二叉搜索树。 #### 平衡二叉搜索树定义 平衡二叉搜索树是一种特殊的二叉搜索树,其中对于任何节点而言,其左子树和右子树的高度差不会超过1。这种结构确保了树的...

    用Java动态数组扩充实现线性表

    线性表的动态扩充实现主要涉及到以下几个关键点: 1. **初始化**:线性表的初始化通常设定一个初始容量,比如10。这样可以避免一开始就分配大量内存,同时也能快速响应初始的插入操作。 2. **扩容机制**:当线性表...

    有两个数组a,b,大小都为n,数组元素的值任意,无序

    考虑到我们的目标是让两个数组的总和之差尽可能小,最直观的想法就是尝试平衡两个数组的元素分布。如果 `sum(a) &gt; sum(b)`,那么应该选择较大的 `a[i]` 与较小的 `b[j]` 进行交换,反之亦然。 #### 2. 算法步骤 - *...

    求解找到数组A[1..n]中元素的最大值和次最大值(本小题以数组元素的比较为标准操作)的算法,并分析其最坏情况的时间复杂度。

    - **动态数据集**:当数组是动态变化的,可以考虑使用数据结构如堆、平衡树等来维护最大值和次最大值。 - **大规模数据**:处理大数据集时,可以采用分治策略或者流式处理方法。 通过以上分析,我们不仅理解了如何...

    树状数组整理材料

    - **单点更新**:更新数组A[i],通过一次O(logn)的迭代,更新C[i]及其所有祖先节点。 - **区间查询**:询问区间[A, B]的聚合信息,同样通过O(logn)的迭代,从C[B]递减地减去C[A-1],得到区间[A, B]的信息。 5. **...

    树状数组基本操作.rar

    树状数组的优点在于其空间效率高,只需要和原始数组同样大小的空间,且操作速度快,对于动态维护区间信息的问题,它的性能通常优于传统的数组遍历或平衡二叉搜索树等方法。 在实际编程中,理解树状数组的工作原理并...

    树tree、动态数组dyArray、hashMap、拼图算法.zip

    接下来,我们将详细探讨这些知识点。 1. **树(Tree)**: 树是一种非线性的数据结构,它由若干个节点组成,每个节点包含一个值,并可能链接到零个或多个子节点。树的概念广泛应用于计算机科学中,如文件系统、...

    树状数组案例示例.zip

    2. **空间效率**:相比其他数据结构如平衡树,树状数组只需要O(N)的空间,更节省内存。 3. **简单易用**:相比于红黑树、AVL树等高级数据结构,树状数组的实现相对简单,容易理解和操作。 ### 五、树状数组的应用...

    简记平衡点问题的实现及改进

    在IT行业中,平衡点问题是一个常见的数据结构与算法问题,主要涉及到数组或链表的处理。平衡点可以理解为一个位置,使得该位置左侧的所有元素之和等于右侧所有元素之和。这个问题在很多实际场景中都有应用,比如游戏...

    树状数组的简单教程与分享

    相较于其他数据结构如线段树、平衡树等,树状数组具有实现简单、效率高的特点,在处理动态数组问题时尤为适用。 #### 二、核心特性 1. **单点更新**:树状数组支持快速地增加或减少数组中特定位置的值。这使得树状...

    有用的C语言源代码-二叉树-链表-数组等

    下面将详细讨论其中涉及的主要知识点。 首先,我们来看"链表"部分。链表是一种线性数据结构,不同于数组,它不连续存储元素。链表由节点构成,每个节点包含数据和指向下一个节点的指针。这里可能包括单链表、双向...

    线段树与树状数组专题讲解

    1. **定义**:线段树是一种平衡二叉树,每个节点代表一个区间,叶子节点对应输入数组中的元素,非叶子节点的区间由其子节点的区间合并而成。 2. **操作**:线段树支持两种主要操作:区间查询和区间更新。区间查询...

    算法-数据结构- 树状数组.rar

    2. **空间效率**:与平衡二分查找树等其他数据结构相比,树状数组的空间复杂度更低,只需要一个数组即可。 3. **易于实现**:相比于其他高级数据结构,树状数组的代码实现相对简单,易于理解和调试。 **五、树状...

    第1章 树状数组 测试数据.rar

    在实际编程时,树状数组常常与其他数据结构如堆、平衡二叉搜索树等结合使用,以解决更复杂的查询和更新问题。例如,在求解动态区间最值问题时,可以结合最小堆来加速查询过程。因此,树状数组是信息学竞赛和算法设计...

    oracle数组存储过程批量插入.docx

    2. 调整数据库的批量插入大小,找到性能与内存消耗的最佳平衡点。 3. 分析和调整SQL执行计划,确保使用了合适的索引和表分区策略。 4. 在必要时,使用Oracle的Bulk Bind功能,它可以一次性绑定多个值,进一步提高...

    c语言基础-c语言编程基础之二维数组操作-两地调度.zip

    二维数组的初始化也是重要的知识点。你可以直接在声明时初始化,如`int array[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};`,这将创建一个3x4的矩阵,每个元素都有初始值。在“两地调度”问题中,这些数值可能...

    js代码-尽量平分数组

    在这个优化版本中,我们遍历数组,计算每个位置作为分割点时两个子数组的长度差,并保存差值最小的情况。最后,根据最佳分割点返回两个子数组。 在`main.js`文件中,可能会包含这样的实现以及测试用例,确保函数在...

    DP-LeetCode152. 乘积最大子数组(Python)

    两者的共同点在于,都利用了数组中正负数交替出现的特点,当遇到一个负数时,之前的最大值可能会变成最小值,而最小值则可能变成最大值。因此,我们需要同时跟踪这两个值来确保在乘以负数后仍能找到正确的最大乘积。...

Global site tag (gtag.js) - Google Analytics