[解题报告]《算法零基础100讲》(第31讲) 多维枚举(一) - 入门(2)

简介: [解题报告]《算法零基础100讲》(第31讲) 多维枚举(一) - 入门(2)

389. 找不同

389. 找不同

https://leetcode-cn.com/problems/find-the-difference/


题目描述


给定两个字符串 s 和 t,它们只包含小写字母。

字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。

请找出在 t 中被添加的字母。


思路


这个题目吧,我之前写过,之前写的实在太强了,我都佩服我自己-.-

还记得异或的性质么。就是异或异或之后就抵消了。所以把所有元素全部异或一边不就得到了最终的值?


char findTheDifference(char * s, char * t){
        char ans = 0;
        for(int i = 0;s[i];i++)
            ans ^= s[i];
        for(int j = 0;t[j];++j)
            ans ^= t[j];
        return ans;
}

1431. 拥有最多糖果的孩子

1431. 拥有最多糖果的孩子

https://leetcode-cn.com/problems/kids-with-the-greatest-number-of-candies/


题目描述


给你一个数组 candies 和一个整数 extraCandies ,其中 candies[i] 代表第 i 个孩子拥有的糖果数目。

对每一个孩子,检查是否存在一种方案,将额外的 extraCandies 个糖果分配给孩子们之后,此孩子有 最多 的糖果。注意,允许有多个孩子同时拥有 最多 的糖果数目


思路


这个题目需要先求出来最大值,然后分别判断就好了,注意空集的处理。

bool* kidsWithCandies(int* candies, int candiesSize, int extraCandies, int* returnSize){
    int max = 0;
    if(candiesSize == 0){    *returnSize = 0;return NULL;}
    *returnSize = candiesSize;
    bool *ans = malloc(sizeof(bool)*candiesSize);
    for(int i = 0; i < candiesSize;i++)    //求最大
        if(max < candies[i])     max = candies[i];
    for(int i = 0; i < candiesSize;i++)//计算结果
        ans[i] = (candies[i] + extraCandies >= max);
    return ans;
}

1588. 所有奇数长度子数组的和

1588. 所有奇数长度子数组的和

https://leetcode-cn.com/problems/sum-of-all-odd-length-subarrays/

题目描述


给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和。

子数组 定义为原数组中的一个连续子序列。

请你返回 arr 中 所有奇数长度子数组的和 。


思路


肯定有简单的方法,但是,不想想了,我直接暴力,三循环0.0

int sumOddLengthSubarrays(int* arr, int arrSize){
    int sum = 0;
    for(int len = 1; len <= arrSize; len += 2 )
        for(int start = 0; start +len <= arrSize; ++ start)
            for(int i = start; i < start + len; ++i)
                sum += arr[i];
    return sum;
}

1534. 统计好三元组

1534. 统计好三元组

https://leetcode-cn.com/problems/count-good-triplets/


题目描述


给你一个整数数组 arr ,以及 a、b 、c 三个整数。请你统计其中好三元组的数量。

如果三元组 (arr[i], arr[j], arr[k]) 满足下列全部条件,则认为它是一个 好三元组 。

   0 <= i < j < k < arr.length

   |arr[i] - arr[j]| <= a

   |arr[j] - arr[k]| <= b

   |arr[i] - arr[k]| <= c

其中 |x| 表示 x 的绝对值。

返回 好三元组的数量 。


思路


肯定有简单的方法,但是,不想想了,我直接暴力,三循环0.0

int countGoodTriplets(int* arr, int arrSize, int a, int b, int c){
    int ans = 0;
    for(int i = 0;i < arrSize -2;i++)
        for(int j = i + 1;j < arrSize - 1;j++)
            for(int k = j + 1;k < arrSize;k++)
                if(abs(arr[i] - arr[j]) <= a && abs(arr[j] - arr[k]) <= b && abs(arr[i] - arr[k]) <= c) ans++;//满足条件判断
    return ans;
}

771. 宝石与石头

771. 宝石与石头

https://leetcode-cn.com/problems/jewels-and-stones/


题目描述


给你一个字符串 jewels 代表石头中宝石的类型,另有一个字符串 stones 代表你拥有的石头。 stones 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。

字母区分大小写,因此 "a" 和 "A" 是不同类型的石头。


思路


典型hash题,不解释。


int numJewelsInStones(char * jewels, char * stones){
    bool has[256];
    int ans = 0;
    memset(has, 0, sizeof(has));
    for(int i = 0; jewels[i]; ++i)//设置hash
        if(has[jewels[i]] == 0) has[jewels[i]] = 1;
    for(int i = 0; stones[i]; ++i)
        if(has[stones[i]] == 1) ans++;
    return ans;
}


1389. 按既定顺序创建目标数组

1389. 按既定顺序创建目标数组

https://leetcode-cn.com/problems/create-target-array-in-the-given-order/


题目描述


给你两个整数数组 nums 和 index。你需要按照以下规则创建目标数组:

目标数组 target 最初为空。

按从左到右的顺序依次读取 nums[i] 和 index[i],在 target 数组中的下标 index[i] 处插入值 nums[i] 。

重复上一步,直到在 nums 和 index 中都没有要读取的元素。

请你返回目标数组。

题目保证数字插入位置总是存在。


思路


让干啥干啥就完事了。


void inserst(int *ans,int *size,int weizhi,int k){
    int wei = (*size)++;
    while(wei != weizhi)    ans[wei] = ans[wei - 1],wei--;
    ans[weizhi] = k;//插入
}
int* createTargetArray(int* nums, int numsSize, int* index, int indexSize, int* returnSize){
    int *ans = malloc(sizeof(int) * numsSize);
    *returnSize = 0;
    for(int i = 0;i < indexSize;i++)
        inserst(ans,returnSize,index[i],nums[i]);
    return ans;
}

14. 最长公共前缀

14. 最长公共前缀

https://leetcode-cn.com/problems/longest-common-prefix/


题目描述


编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。


思路


按照一步一步求就好了。直接看把。


int qianzui(char *s,char *t,int size){//求两个字符串的公共前缀在第一个串的位置
    int i;
    for(i = 0;t[i] && i <= size;i ++)
        if(s[i]!= t[i]) return i - 1;
    if(!t[i])   return i - 1;
    return size;
}
char * longestCommonPrefix(char ** strs, int strsSize){
    if(strsSize < 2)    return strs[0];
    int size = strlen(strs[0])-1;
    size = qianzui(strs[0],strs[1],size);
    for(int i = 2;i<strsSize;i++)
        size = qianzui(strs[0],strs[i],size);
    //写入并返回结果
    char *ans = malloc(sizeof(char)*(size +2));
    for(int i = 0;i <= size;i++)
        ans[i] = strs[0][i];
    ans[size + 1] = 0;
    return ans;
}

1925. 统计平方和三元组的数目

1925. 统计平方和三元组的数目

https://leetcode-cn.com/problems/count-square-sum-triples/


题目描述


一个 平方和三元组 (a,b,c) 指的是满足 a2 + b2 = c2 的 整数 三元组 a,b 和 c 。

给你一个整数 n ,请你返回满足 1 <= a, b, c <= n 的 平方和三元组 的数目。


思路


直接暴力刚0.0


int max( int a, int b){
    return a > b ? a : b;
}
int countTriples(int n){
    int a, b , c, sum, ans = 0, n1 = n /1.4;//根号2 嘿嘿黑 缩小范围
    for(int a = 1; a <= n1 ; ++a){
        for(b = a; b < n ; ++b){
            sum = a*a + b*b;
            for(c = max(a, b) +1; c <= n; c++){
                if(sum == c *c){
                    if(a !=b ) ans += 2;
                    else ans++;
                    break;
                }
                else if(sum < c*c)
                    break;
            }
        }
    }
    return ans;
}
相关文章
|
5月前
|
机器学习/深度学习 人工智能 算法
深度学习入门:理解神经网络与反向传播算法
【9月更文挑战第20天】本文将深入浅出地介绍深度学习中的基石—神经网络,以及背后的魔法—反向传播算法。我们将通过直观的例子和简单的数学公式,带你领略这一技术的魅力。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你打开深度学习的大门,让你对神经网络的工作原理有一个清晰的认识。
|
3月前
|
机器学习/深度学习 算法 Python
机器学习入门:理解并实现K-近邻算法
机器学习入门:理解并实现K-近邻算法
56 0
|
4月前
|
机器学习/深度学习 算法
机器学习入门(三):K近邻算法原理 | KNN算法原理
机器学习入门(三):K近邻算法原理 | KNN算法原理
|
4月前
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)
|
4月前
|
机器学习/深度学习 算法
机器学习入门:梯度下降算法(上)
机器学习入门:梯度下降算法(上)
|
4月前
|
机器学习/深度学习 算法 API
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
|
4月前
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
168 0
|
4月前
|
算法 C++
【算法解题思想】动态规划+深度优先搜索(C/C++)
【算法解题思想】动态规划+深度优先搜索(C/C++)
|
1天前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
1月前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。

热门文章

最新文章