题目一:
给定一个整数数组 nums 和一个整数目标值 target,请你判断数组中是否存在两数之和等于target,存在则输出YES,不存在则输出NO。
示例 :
输入:nums = [2,7,11,15], target = 9 输出:YES 解释:因为 nums[0] + nums[1] == 9 。
思路一:遍历,暴力枚举,依次计算出数组中所有元素两两之间的和,只要找到一个值等于target即可停止查找。
char* addsums(int* nums, int numsSize, int target, int* returnSize) {
for (int i = 0; i < numsSize; i++) {//第一层循环
for (int j = i + 1; j < numsSize; j++) {//第二层循环
if (nums[i] + nums[j] == target) {//判断数组中两个数是否相等
return YES;//存在相等输出YES
}
}
}
return NO;//遍历结束还没有找到输出NO
}
题目二:
给你一个整数数组 nums ,请计算数组的 中心下标 。
数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。
如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。
示例 1:
输入:nums = [1, 0, 3, 5, -2, 6]
输出:3
解释:
中心下标是 3 。
左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 0 + 3 = 4 ,
右侧数之和 sum = nums[4] + nums[5] = -2 + 6 = 4 ,二者相等。
分析:
1 | 0 | 3 | 5 | -2 | 6 |
sum1 | center | sum2 | |||
sum |
我们这这里遇到的第一个困难是,在遍历中心的时候,要算一下左边的数组的和,又要算右边的数组的和,在程序设计上非常麻烦。那我们就观察一下其特点
sum1=sum2;且sum1+sum2+center=sum;则2sum1+center=sum时center既为数组中心
我们这时候发现只要在遍历过程中记录已经遍历的数组的和知否满足要求即可
int pivotIndex(int* nums, int numsSize) {
int sum=0;//数组总和
int sum1=0;//左侧数组之和
for(int i=0 ;i<numsSize; i++)
{
sum=nums[i]+sum;//遍历数组计算出数组总和
}
for(int i=0 ;i<numsSize; i++)
{//两倍左侧数组之和加上当前位置的数值等于数组总和,既可说明当前位置的左侧和右侧的数组之和相等,既当前位置为数组中心
if(2*sum1+nums[i]==sum)
{
return i;
}
sum1=sum1+nums[i];
}
return -1;
}