三:哈希map day6 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数● 1. 两数之和

今日任务 

● 哈希表理论基础 
● 242.有效的字母异位词 
● 349. 两个数组的交集 
● 202. 快乐数
● 1. 两数之和   

今日任务 

  •  242.有效的字母异位词 

  • 题目
        大型概括:map 的使用
  •     1.题目描述-->思路:
  •                 给出两个string s,t;  各自对应的字母数量要一致
  • 思路:     
  •              利用一个map,s对map++;t对map--;

                 遍历map的时候,有非0的,就是假;
  •  2.输入 返回值:bool 01
    • 3.边界情况:风险:必须二者长度相等,否则,直接返回假!
  • class Solution {
    public:
        bool isAnagram(string s, string t) {
           map<char,int>Mymap;
           if (s.length() != t.length())
                return false;
    
           for(int i=0;i<s.size();i++){
            char a= s[i];
            char b = t[i];
                Mymap[a]++;
                Mymap[b]--;
           }
               for(int i=0;i<s.size();i++){
               if( Mymap[s[i]]!=0)
                    return false;    
           }
        return 1;}

349. 两个数组的交集 

题目
    大型概括:辅助map +vector(返回值)

方案一:(错误代码没写)

nums1 贡献为 ++

nums2 贡献为   --

最后用nums1为🗡值,遍历到  <=0的,一律添加到vector

没考虑nums2的新元素加入map,也会造成--!!!;

除非只拿nums1作为🗡值去遍历。

方案二:标记法

                nums1 进入map,将数值设置为 2;

              nums2进入map,先检查这里的🗡值是否为2,是的话,改标记为1


    1.题目描述-->思路:

    2.输入 返回值:

    3.边界情况:

    4.时空复杂度:

    5.进一步优化:

利用迭代器! 

#include <vector>
#include <map>

class Solution {
public:
    std::vector<int> intersection(std::vector<int>& nums1, std::vector<int>& nums2) {
        std::map<int, int> Mymap;
        std::vector<int> qq;
        
        // 标记 nums1 中的元素
        for (int num : nums1) {
            Mymap[num] = 2;
        }
        
        // 找出同时在 nums1 和 nums2 中的元素,并标记为 1
        for (int num : nums2) {
            if (Mymap[num] == 2) {
                Mymap[num] = 1;
            }
        }
        
        // 收集交集结果
        for (auto& pair : Mymap) {
            if (pair.second == 1) {
                qq.push_back(pair.first);
            }
        }
        
        return qq;
    }
};

 202. 快乐数 (个人方法,待验证)

题目
    大型概括:方法

  想到了一个证明方法,即缩小问题的规模,问题描述的是2^31-1范围内的数字,其实第一步的计算中(代码中的each),算得最大的数字是 760(Norigin=2XXXXXXX,但是取1999999.。。),第二步的each最大值(由第一步的假设699得到)198。若要成为快乐数,必须要在某一步的计算中,成为1 10 100(不能为1000,因为第一步得到的最大值只有760)。     将原来的题目改成:1-1000(实际为1-760)内的数字 求全部的快乐数。 具体的证明:先求出1-760内全部的快乐数,再测试7步内能得到这样的结果么? 其实count=7是我 几个数字验证几下出来的,5 6 7; 只要能涵盖1-1000的数字的验证即可。


    1.题目描述-->思路:

    2.输入 返回值:

    3.边界情况:

    4.时空复杂度:

    5.进一步优化:

超时代码:1.虽然考虑无限循环,但是要设置步数

                   思路:内层循环:让每个项都化成 平方累加

                                外层循环,让each = sum,sum=0 进入循环

                                退出:each ==1 

class Solution {
public:
    bool isHappy(int n) {
        int sum =0;
        int each =n;
        int count=0;
        while(each!=1){
            if(count==5)
                return false;
        while(each){
            int a = each%10;
            each = each/10;
            sum+=a*a;
            count++;
        }
        each = sum;
        sum=0;
        }
        return 1;
    }
};

优化方法:

class Solution {
public:
    bool isHappy(int n) {
        int sum;
        int each = n;
        int count = 0;
        
        while (each != 1 && count < 10) { // 修改为 count < 5
            sum = 0; // 重置 sum
            while (each) {
                int a = each % 10;
                each = each / 10;
                sum += a * a;
            }
            each = sum;
            count++;
        }
        
        return each == 1; // 如果 each == 1,返回 true
    }
};

 

1. 两数之和   (暴力法)

题目
    大型概括:方法

    1.题目描述-->思路:

    2.输入 返回值:

    3.边界情况:

    4.时空复杂度:

    5.进一步优化:纯暴力法,双for
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int size = nums.size();
        vector<int>a;           //辅助
        for(int i=0;i<size-1;i++){
            for(int j=1+i;j<size;j++){
                if(nums[i]+nums[j]==target){
                      a.push_back(i);
                      a.push_back(j);
                      return a;
                }
                    
            }
        }
        return a;
    }
};
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计算机视觉入门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值