力扣周赛第254期(上)

141 阅读1分钟

这是我参与8月更文挑战的第22天,活动详情查看:8月更文挑战

1967. 作为子字符串出现在单词中的字符串数目

截屏2021-08-22 下午4.34.25.png

思路分析

就算是第一题也没必要挨个判断是不是子字符串啊

int numOfStrings(vector<string>& patterns, string word) {
        int ret =0;
        for(int i = 0; i < patterns.size(); i++){
            if(word.find(patterns[i]) != -1){
                ret++;
            }
        }
        return ret;
    }

1968. 构造元素不等于两相邻元素平均值的数组

截屏2021-08-22 下午7.55.09.png

思路分析

最开始我的想法是根据遍历时的结果,当出现arr[i - 1] + arr[i + 1] = 2 * arr[i]的时候对两个相邻元素进行调换,然后就陷入了漫长的对不可能出现调换后结果平均的问题进行证明,然而这个思路是很难走通的。

当我们看到 返回满足题意的任一重排结果时,在答案非唯一的情况下,完全可以使用更普适的方法。当出现arr[i - 1] + arr[i + 1] = 2 * arr[i]的时候,必然是有arr[i - 1] - arr[i] = arr[i] - arr[i + 1] 的,也就是说,在数组元素本身互不相等的情况下,只要arr[i - 1] 和arr[i + 1]都大于arr[i], 或者arr[i - 1] 和arr[i + 1]都小于arr[i],就可以保证不会出现平均数的情况,因此我们可以将数组排序后,分为小和大两部分,保证小的部分中,所有元素严格小于任何大的部分中的元素,并将小和大交叉排列,这样就可以保证没有arr[i - 1] + arr[i + 1] = 2 * arr[i]的情况了。

sort(nums.begin(), nums.end());
int n = nums.size();
vector<int> res;
for (int i = 0; i <  (n + 1) / 2; ++i){
    res.push_back(nums[i]);
    if (i + (n + 1) / 2 < n){
        res.push_back(nums[i + (n + 1) / 2]);
    }
}
return res;