leetcode1502-判断能否形成等差数列
我的原始代码
class Solution {
public:
bool canMakeArithmeticProgression(vector<int>& arr) {
sort(arr.begin(),arr.end());
int sizes=arr.size(),n=arr[1]-arr[0];
for(int i=2;i<sizes;i++)
{
if(arr[i]-arr[i-1]!=n) return false;
}
return true;
}
};
不使用排序的方法
class Solution {
public:
bool canMakeArithmeticProgression(vector<int>& arr) {
int minNum = INT_MAX, maxNum = INT_MIN;
unordered_map<int, int> map;
int diff;
for(int num : arr){
map[num]++;
minNum = min(minNum, num);
maxNum = max(maxNum, num);
}
if(maxNum == minNum)
return true;
if((maxNum - minNum) % (arr.size() - 1)) //这里是剪枝,如果不是等差数列,size-1次变化后的总变化量与变化次数取余一定不为0
return false;
else
diff = (maxNum - minNum) / (arr.size() - 1); //这里初步认定公差,但不确定是否为真
for(int i = minNum; i <= maxNum; i+=diff){
if(map.find(i) == map.end()) //如果从最小值逐渐加公差找不到i,则说明不是等差数列
return false;
}
return true;
}
};
剪枝指的是在深度优先搜索中去掉一些不符合题目要求的或是浪费时间而没有作用的答案,从而使得深度优先搜索能够更快得到正确答案。因为在搜索树中去掉答案形似剪掉树的枝叶,所以这一方法被称为剪枝。