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])
就可以将数组三等分。最开始被卡住了,不知道如何下手,结合三部分的和相等,可以把三部分等分,实在是太菜了!!!for求出均值,判断是否能整除3,不能就结束,再来一个for循环,来个累加,累加值为ave,就将ave = A[i]就可以结束了,但有些细节地方要注意,最后出循环时,ave不一定是为平均值,也可能是0。后面自己加了一个样例,(0,0),按照我自己的代码依然仍过,我就加了个判定条件,(这个地方怎么很好的处理,我也是很迷!!!).最后贴上源码
class Solution {
public:
bool canThreePartsEqualSum(vector<int>& A) {
int ave = 0, a = 0, num = 0;
if(A.size() < 3)
return false;
for(int i = 0; i < A.size(); i++)
{
ave += A[i];
}
if(ave % 3 != 0)
return false;
ave = ave / 3;
for(int i = 0; i < A.size(); i++)
{
if(a != ave)
a += A[i];
else
{
a = A[i];
num++;
}
}
if(num >= 2 && (a == ave || a == 0))
return true;
else
return false;
}
};
来看第二题:
给定正整数 K
,你需要找出可以被 K 整除的、仅包含数字 1 的最小正整数 N。
返回 N
的长度。如果不存在这样的 N
,就返回 -1
。
看到题目:思路也很清晰,基本上就是暴力枚举,但是这样肯定会爆掉,结合题目所说的整除,很容易联想到数学中计算余数的一些定理。
在这里,还有一个疑问:for循环终止的条件,对于不能满足的情况,循环多少次才能判定它是不能满足的情况。 (刚刚问了大佬,一般取10^5、10^6)
来看第三题:
给定正整数数组 A
,A[i]
表示第 i
个观光景点的评分,并且两个景点 i
和 j
之间的距离为 j - i
。
一对景点(i < j
)组成的观光组合的得分为(A[i] + A[j] + i - j
):景点的评分之和减去它们两者之间的距离。
返回一对观光景点能取得的最高分。
看到这道题最开始的想法是懵逼的,本打算暴力for循环,看了数据的范围,肯定会爆掉,首先要对得分做一个转化处理,得到其等价:A[i] + i + A[j] - j;
此题有一点动态规划的感觉在里面
其中value表示:第i个元素之前(包含第i个元素),出现的A[k] + A[j] + k - j 最大值
pre表示起始的最大值,即A[i]+i
来看第四题:
给定一个二进制字符串 S
(一个仅由若干 '0' 和 '1' 构成的字符串)和一个正整数 N
,如果对于从 1
到 N
的每个整数 X
,其二进制表示都是 S
的子串,就返回 true
,否则返回 false
。
最开始的想法就是暴力for循环,想的比较简单,直接i从1-N循环,判断i的二进制串在不在其中,这样可能会超时,但如果从另外一个角度列举字串的所有可能(大概是1000*35/2)复杂度小的多,并且不用把数字转成二进制
最后的总结:对于简单题,暴力循环基本上能解决其中的问题,但在暴力循环时也应该考虑如何把循环次数降下来。