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 {};
    }
};