1.给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false。
形式上,如果可以找出索引 i+1 < j 且满足 (A[0] + A[1] + ... + A[i] == A[i+1] + A[i+2] + ... + A[j-1] == A[j] + A[j-1] + ... + A[A.length - 1]) 就可以将数组三等分。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum
class Solution {
public:
bool canThreePartsEqualSum(vector<int>& A) {
int sum=0;
for(int i=0;i<A.size();i++)
{
sum+=A[i];
}
if(sum%3!=0) return false;//数组里所有数的和应该被三整除
int avg=sum/3;//三等分
int count=0,cur=0;//从前往后遍历,找到等于三等分的就count++
for(int i=0;i<A.size();i++)
{
cur+=A[i];
if(cur==avg)
{
count++;
cur=0;
}
if(count==2&&(i!=A.size()-1))//为了防止[1,-1,1,-1]这样的测试用例
{
return true;
}
}
return false;
}
};2.给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> m;
for(int i=0;i<nums.size();i++)
{
m[nums[i]]=i; //key值是数组的值,value是数组的下标
}
for(int i=0;i<nums.size();i++)
{
if(m.find(target-nums[i])!=m.end()&&m[target-nums[i]]!=i)
return {i,m[target-nums[i]]};//如果找到符合的key,就找这个key对应的value,返回value和i
}
return {};
}
};
京公网安备 11010502036488号