首页 > 编程语言 >算法练习-day5

算法练习-day5

时间:2023-06-12 14:01:46浏览次数:50  
标签:map arr 练习 set day5 算法 vector 元素 unordered

哈希表

242. 有效的字母异位词

题意:给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。注意:若s和t中每个字符出现的次数都相同,则称s和t互为字母异位词。

示例:

算法练习-day5_哈希表

       思路:我们可以先创建一个unordered_map用于记录s中元素出现的次数,然后再遍历t,让t出现元素次数减去s出现次数。最后在对map进行遍历,若map中存储的元素次数全为0,则说明两字符串互为字母异位词,输出true;否则输出false

    bool isAnagram(string s, string t) {
        unordered_map<char,int> map;
        for(auto e:s)
        {
            map[e]++;
        }
        for(auto e:t)
        {
            map[e]--;
        }
        for(auto e:map)
        {
            if(e.second!=0)
            {
                return false;
            }
        }
        return true;
    }

349. 两个数组的交集

题意:给定两个数组nums1和nums2,返回它们的交集唯一的。我们可以不考虑输出结果的顺序 。

示例:

算法练习-day5_哈希表_02

      思路:大体思路都是一样的,都是先去除数组中重复的元素,然后通过find找出另一个数组中的重复元素,再插入到输出数组中。有两种去重方法:1.vector去重,vector中有一个函数unique,可以将数组中重复的元素移动到数组末尾,返回的迭代器就是重复元素的首元素位置,然后将数组重复元素去除即可;2.利用unordered_set的特性去重:unordered_set的特性有:无序性,唯一性,快速查找和插入删除的特点,唯一性就是存储的元素是唯一的

vector去重代码:

    void DelRepeat(vector<int>& num)//去重
    {
        sort(num.begin(), num.end());
        auto it = unique(num.begin(), num.end());//该函数可以将数组中重复元素放在末尾,并返回重复元素的起始位置
        num.erase(it, num.end());//删除重复元素
    }
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        DelRepeat(nums1);
        DelRepeat(nums2);
        vector<int> arr;
        for(auto e:nums1)
        {
            if(find(nums2.begin(),nums2.end(),e)!=nums2.end())
            {
                arr.push_back(e);
            }
        }
        return arr;
    }

利用unordered_set特性去重代码:

    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> set1(nums1.begin(), nums1.end());//使用unordered_set的特性:值唯一去重
        unordered_set<int> set2(nums2.begin(), nums2.end());
        vector<int> arr;
        for (auto e : set1)//遍历set1,找出set1和set2中重复的元素
        {
            if (set2.find(e) != set2.end())
                arr.push_back(e);
        }
        return arr;
    }

202. 快乐数

题意:编写一个算法来判断一个数n是不是快乐数。

「快乐数」定义为:

  1. 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  2. 然后重复这个过程直到这个数变为1,也可能是 无限循环 但始终变不1。
  3. 如果这个过程 结果为1,那么这个数就是快乐数。

如果 n 是快乐数就返回 true ;不是,则返回false。

示例:

算法练习-day5_哈希表_03

       思路:判断快乐数非常简单,根据定义进行无限循环,如果循环结果有1,就表示该数为快乐数;但是如果不为快乐数,那就真的无限循环了,因此我们需要有一个判断条件,证明该数就不是快乐数。我们可以使用任意数组存储每次数位平方和的结果,当某次的数位平方和在数组中存在,就说明进入了循环的入口,该数字也就一定不是快乐数

    long long HappyNum(int n)//可以计算出该元素每个位置数字的平方和
    {
        long long sum = 0;
        while (n)
        {
            sum += ((n % 10)*(n % 10));
            n /= 10;
        }
        return sum;
    }
    bool isHappy(int n) {
        unordered_set<int> set;
        while (n)
        {
            long long sum = HappyNum(n);//预防越界,定义long long接收函数返回值
            if (sum == 1)//等于1,说明是快乐数
            {
                break;
            }
            if (set.find(sum) != set.end())//由于不是快乐数会导致无限循环,因此肯定在循环期间有一个数会是循环的起始
            {
                return false;
            }
            set.insert(sum);
            n = sum;
        }
        return true;
    }

1. 两数之和

题意:给定一个整数数组nums和一个整数目标值target,请你在该数组中找出 和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。

示例:

算法练习-day5_哈希表_04

       思路:本题有两种思路,1.暴力求解:两层for循环,找出两数组合的所有可能,若有等于target的情况,写入arr中,时间复杂程度为O(n^2);2.使用unordered_map特性求解:由于unordered_map查找元素的时间复杂程度为O(1),因此我们可以将元素一一放入其中进行匹配,若有两个元素等于target,则输出arr,即节省时间,又节约空间

   vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> arr;
        for (int i = 0; i < nums.size(); i++)//两层for循环遍历,时间复杂程度为O(n^2)
        {
            for (int j = i + 1; j < nums.size(); j++)
            {
                if (nums[i] + nums[j] == target)
                {
                    arr.push_back(i);
                    arr.push_back(j);
                    break;
                }
            }
        }
        return arr;
    }
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int> map;
        vector<int> arr;
        for(int i=0;i<nums.size();i++)
        {
            auto e=map.find(target-nums[i]);//将find找到的与之匹配的元素迭代器,之后需要保存
            if(e!=map.end())//找到该元素
            {
                arr.push_back(i);
                arr.push_back(e->second);
                break;//跳出循环,减少时间和空间的消耗
            }
            map[nums[i]]=i;//若没有与之匹配的元素,则引入下一个元素继续判断,节省空间
        }
        return arr;
    }

标签:map,arr,练习,set,day5,算法,vector,元素,unordered
From: https://blog.51cto.com/u_15209404/6461965

相关文章

  • 算法分析期末复习
    算法分析期末复习第一章算法概述基本理论知识课后作业做过的类型渐进阶排序,类似课后作业:1-3输入规模,类似课后作业:1-4,1-5第二章递归与分治基本概念,基本思想递归:直接或间接的调用自身的算法。分治:分治法的子问题间是相互独立的,子问题不包含公共的子问题。......
  • 深度学习降噪专题课:实现WSPK实时蒙特卡洛降噪算法
    大家好~本课程基于全连接和卷积神经网络,学习LBF等深度学习降噪算法,实现实时路径追踪渲染的降噪本课程偏向于应用实现,主要介绍深度学习降噪算法的实现思路,演示实现的效果,给出实现的相关代码线上课程资料:本节课录像回放加QQ群,获得相关资料,与群主交流讨论:106047770本系列文章为......
  • RC4加密算法及Python实现
    一、RC4加密算法原理RC4算法是一种流加密算法,由RonRivest在1987年设计。它的主要特点是简单快速,而且在加密解密过程中使用的密钥长度可变。因此,RC4算法被广泛应用于网络安全领域,如SSL、TLS、WEP、WPA等协议中。RC4算法的加密过程如下:初始化S盒和T数组。S盒是一个256字节的数组,用于......
  • 4.4 分类算法-逻辑回归与二分类以及分类的评估方法
    1逻辑回归的简介1.1简介逻辑回归(LogisticRegression)是机器学习中的一种分类模型,逻辑回归是一种分类算法,虽然名字中带有回归,但是它与回归之间有一定的联系。由于算法的简单和高效,在实际中应用非常广泛。1.2应用场景广告点击率(是否会被点击)是否为垃圾邮件是否患病金融诈......
  • 算法题:球反弹高度问题
    一个球从100米高度自由落下,每次落地反弹回原高度一半。求它在第10次落地时候,共经过多少米? 第十次反弹高度是多少?//设经过路程为sum每次反弹高度为F$f=100;$sum=100;for($i=1;$i<=10;$i++){$f=$f/2;$sum=$sum+$f;}echo"共经过".$sum."米,第10次反......
  • 【LeetCode.384打乱数组】Knuth洗牌算法详解
    前两天看网易面筋得知网易云的随机歌曲播放使用了这个算法,遂找题来做做学习一下打乱数组https://leetcode.cn/problems/shuffle-an-array/给你一个整数数组nums,设计算法来打乱一个没有重复元素的数组。打乱后,数组的所有排列应该是等可能的。实现Solutionclass:Solution......
  • 算法题:百钱买鸡问题
    公鸡5文钱一只母鸡3文钱一只小鸡一文钱3只 问100文钱,要买100只鸡,每种鸡不少于一只 那么100只鸡中,公鸡母鸡小鸡各有多少只//设公鸡数g母鸡数m小鸡数x//那么g*5+m*3+x/3=100文for($g=1;$g<=100;$g++){for($m=1;$m<=100;$m++){for($x=1;$x<=1......
  • 神经网络反向传播算法(BP)
    前面讲了神经网络的前向传播算法,下面再对反向传播算法进行总结。反向传播算法也称为误差逆传播(errorBackPropagation),是指基于梯度下降对神经网络的损失函数进行迭代优化求极小值的过程,它不仅可应用于前馈神经网络,还可以用于其他类型的神经网络。需要注意的是,大家提及到的“BP网......
  • 算法题:找出阿姆斯壮数
    Armstrong(阿姆斯壮)数是等于其数字的立方数之和的数字, 如153可以满足1*1*1+5*5*5+3*3*3=153,试写出一程序找出所有的三位数Armstrong数。采用穷举法,把数分成三位,遍历从100到999,如果三个数立方数之和等于它自己,则输出。//找出所有三位数的Armstrong数function......
  • 图像增强算法受环境影响几种校正方式
    图像增强环境影响几种校正方式由于受到环境,光线、噪音、不同设备拍摄的清晰度和对比度等也会影响到图像最终的采集效果,不能够直接采取图像中的重点部分。以下几种校正方式可以单独应用或者结合使用,以根据图像的特征和需求来提高图像的质量和视觉效果。根据不同的应用场景和目标,选择......