问题:给定一个整数数组,写一个算法实现判断是否存在一个和为零的子数组。
答:算法思路:计算数组的前缀和,然后将前缀和进行排序,如果存在连续两个元素相同的情况即存在一个和为零的子数组,否则不存在。
算法的代码实现:
//
// main.cpp
// MyProjectForCPP
//
// Created by labuser on 11/2/11.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#include <iostream>
#include <math.h>
#define YES 1
#define NO 0
using namespace std;
void sort(int x[],int n);
int zero_sum(int x[],int n){
int i;
for(i=1;i<n;i++){
x[i]+=x[i-1];
}
sort(x,n);
for(i=1;i<n && x[i]!=x[i-1];i++);
return (i==n) ? NO : YES;
}
void sort(int x[],int n){
int i,j;
int temp;
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){
if(x[i]>x[j]){
temp = x[i];
x[i]=x[j];
x[j]=temp;
}
}
}
}
int main (int argc, const char * argv[])
{
int x[] = {4,-1,2,1,-2,-1,5};
int n = sizeof(x)/sizeof(int);
int i;
printf("\nZero Sum Sunarray Check Program");
printf("\n===============================");
printf("\n\nGiven Array : ");
for(i=0;i<n;i++)
printf("%4d",x[i]);
if (zero_sum(x, n)==YES) {
printf("\n\nYES, there is some range summing up to 0");
}else{
printf("\n\nNO! no such subarray found!");
}
printf("\n\n");
return 0;
}
运行结果:
GNU gdb 6.3.50-20050815 (Apple version gdb-1705) (Fri Jul 1 10:44:54 UTC 2011)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".tty /dev/ttys002
[Switching to process 17846 thread 0x0]
Zero Sum Sunarray Check Program
===============================
Given Array : 4 -1 2 1 -2 -1 5
YES, there is some range summing up to 0
Program ended with exit code: 0
分享到:
相关推荐
题目要求给定一个整数数组,计算并返回数组中任意两个元素之差的最大值。 #### 解决方案 为了找到数组中任意两个元素之差的最大值,可以采用排序的方法。首先对数组进行排序,然后计算排序后数组中最大值与最小值...
给定一个整数数组`nums`和一个整数`target`,我们要找到数组中两个不重复的元素,它们的和等于`target`。返回这两个元素的索引,顺序不限。因为数组中元素不能重复出现,所以每个元素只能使用一次。 为了高效地解决...
给定一个由括号和字符组成的字符串,要求检查括号是否匹配。 **解决方案示例:** ```cpp #include #include #include using namespace std; bool isBalanced(const string& s) { stack<char> bracketStack; ...
4. **集合的增删改查**:添加元素、删除元素、修改元素和检查元素是否存在。 5. **集合的复制**:创建集合的副本,如使用new ArrayList(原集合)。 6. **集合的比较**:使用equals()和hashCode()方法比较集合内容。 7...
- 实现思路:首先检查数组`c`中是否有空位可以插入新的元素。若有,则在合适的位置插入该整数;若无,则需要提示用户数组已满。 5. **从integerSet对象中删除一个整数** - 方法名:`public void delete()` - ...
该方法接收两个参数:一个存储整数数组的ArrayList `ma` 和一个整数 `num`,表示要从每组数组中取出的元素数量。接下来,我们逐段分析这段代码: 1. `Alg` 方法中首先初始化了一个空字符串 `tem`,用于存放合并后的...
在JavaScript编程中,题目所描述的问题是一个常见的数组操作问题,涉及到对数组元素的移动和排序。这个问题的关键在于如何高效地实现0元素与非0元素的分离,同时保持非0元素原有的顺序。这个问题可以使用双指针法来...
这段代码定义了`FindCombinations`函数,它接受一个整数数组和一个目标值,然后调用私有辅助函数`FindHelper`进行递归操作。`FindHelper`函数负责处理实际的组合生成,并通过回溯来尝试不同的选择。 总结来说,"c# ...
给定一个可能包含负数的整数数组 `nums`,你的任务是找出一个具有最大和的连续子数组(子数组最少包含一个元素),并返回它的最大和。 例如,对于数组 `[−2, 1, −3, 4, −1, 2, 1, −5, 4]`,最大连续子数组和为 ...
因此,当我们将一个数组转换为另一个类型时,我们需要考虑到元素大小的差异。例如,int通常占用4个字节,而uchar占用1个字节。这意味着4个uchar可以组成一个int。 3. 序列化与反序列化:将整形数组转换为字符数组的...
给定一个整数数组A,我们要检查是否可以找到三个连续的非空子数组,使得这三个子数组的和相等。例如,在示例1中,数组`[0, 2, 1, -6, 6, -7, 9, 1, 2, 0, 1]`可以被划分为`[0, 2, 1]`, `[2, -6, 6, -7, 9, 1]`, 和`...
如果不存在0,那么我们需要检测数组中的每个数字的余数,对于余数为1和2的数字,我们可以删除最小的一个,直到数组中所有数字的余数之和能被3整除。最后,我们输出构建的最大整数。 代码实现: 以下是使用C++语言...
- 定义:最大子数组问题是在一个给定的整数数组中找到具有最大和的连续子数组的问题。 - 特点:动态规划算法通过构建一个状态转移方程来表示子问题的解与原问题的解之间的关系,从而高效地解决问题。 2. 算法步骤...
在编程领域,"2-sum"问题是一个常见的算法挑战,它涉及到在给定的整数数组中寻找两个元素,使得它们的和等于一个特定的目标值。这个问题对于理解和掌握基础的算法设计以及数据结构优化至关重要,特别是在面试和编程...
在给定的“vb 随机数组 区分奇偶 并排列大小”的场景中,我们需要创建一个随机数组,然后区分其中的奇数和偶数,并根据数值大小进行排序。下面将详细讲解如何实现这一过程。 首先,我们创建一个随机数组。在VB中,...
在这个思维挑战中,我们面临的是一个关于一维数组和数据处理的问题。问题的核心是,给定一个包含0到9之间随机数字的数组,我们需要找出数组中未出现的数字。这通常被称为“缺失数字”问题,它涉及到数组遍历、条件...
在编程中,检测一个数列是否符合勾股定理,即判断它是否为勾股数组,是一项常见的任务。勾股数组是由三个正整数构成的有序数组 (a, b, c),满足 a² + b² = c²。例如,(3, 4, 5) 就是一个典型的勾股数组,因为 3²...
标题“afl数组_是否属于数组成员”指的是一个功能,该功能用于判断某个给定的数据是否存在于指定的数组之中。 易语言,全称“易语言·形意”,是中国开发的一款特色编程系统,其语法设计简洁明了,注重易学易用,...
问题描述:给定一个数组和一个目标值,找出数组中和为目标值的两个数。 解决方法:使用哈希表记录数组中每个元素对应的值,遍历数组,检查目标值与当前元素的差值是否存在于哈希表中。 这些题目涵盖了数组的常见...