首页 > 其他分享 >代码随想录训练营day8|第202题. 快乐数、两数之和、第454题.四数相加II

代码随想录训练营day8|第202题. 快乐数、两数之和、第454题.四数相加II

时间:2023-03-09 23:00:37浏览次数:54  
标签:map 四数 下标 sum 元素 随想录 value key 两数

202. 快乐数

题目链接:202. 快乐数
题目描述:编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。

如果 n 是快乐数就返回 True ;不是,则返回 False

示例:

输入:19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

思路

题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要!
当我们发现要快速判断一个元素是否出现集合里的时候--》考虑哈希法!!!
判断sum是否重复出现就可以使用unordered_set。

class Solution {
public:
    int getSum(int n) {// 取数值各个位上的单数之和
        int sum = 0;
        while (n) {
            sum += (n % 10) * (n % 10);//sum=n%10*2 + sum;
            n /= 10;
        }
        return sum;
    }
    bool isHappy(int n) {//当sum重复是1后就返回true
        unordered_set<int> set;
        while(1) {
            int sum = getSum(n);
            if (sum == 1) {
                return true;
            }
            // 如果这个sum曾经出现过,说明已经陷入了无限循环了,立刻return false
            if (set.find(sum) != set.end()) {
                return false;
            } else {
                set.insert(sum);
            }
            n = sum;
        }
    }
};

1. 两数之和

题目链接:1. 两数之和
题目描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

思考

本题虽说是力扣的第一题,但是对于初学算法的小白并不友好。着重考察对map的理解与应用,本题思路是需要一个集合去存放我们已经便利过的元素,然后再遍历数组的时候去访问这个集合,不仅要知道这个元素是否遍历过,还需要知道这个元素对应的下标,需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适。
map是一种key value的存储结构,可以用key保存数值,用value在保存数值所在的下标。
std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。
同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。

1、map目的用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下标,这样才能找到与当前元素相匹配的(也就是相加等于target)
2、判断元素是否出现,这个元素就要作为key,所以数组中的元素作为key,有key对应的就是value,value用来存下标。所以 map中的存储结构为 {key:数据元素,value:数组元素对应的下标}。

代码实现

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target){
    	unordered_map(int, int)map;//定义unordered-map是用来存放我们遍历过的元素 
		for(i=0; i<nums.size(); i++){//开始遍历数组 
			s = target - nums[i];//寻找我们要查询的值:eg:第一个为2 则找tar-2的元素值 
			iter = map.find(s); 	//map的一个遍历方式去选找s 
			if(iter  != map.end()){//如果找到元素在map出现过 
			return {iter->valve, i} //返回 元素下标
		}
		 // 如果没找到匹配对,就把访问过的元素和下标加入到map中
            map.insert(pair<int, int>(nums[i], i));
		}	
		return {}; //遍历结束还没找到,就返回空集合 
	}
	}

总结

其实有四个重点:
1.为什么会想到用哈希表
2. 哈希表为什么用map
3. 本题map是用来存什么的
4. map中的key和value用来存什么的
把这四点想清楚了,本题才算是理解透彻了。

标签:map,四数,下标,sum,元素,随想录,value,key,两数
From: https://www.cnblogs.com/lijian-allan/p/17201570.html

相关文章

  • 代码随想录算法Day37 | 738.单调递增的数字
    738.单调递增的数字题目链接:738.单调递增的数字-力扣(LeetCode)思路将数字转换成字符数组形式,然后从后向前遍历,当遇到当前这个数大于后一个数的时候,这个数减一,他的后一......
  • 2. 两数相加
    思路:所给的链表是逆序的,要求返回的也是逆序的,这正是模拟人在做加法运算时候的进位习惯,从低位到高位运算。只需要新建一个列表存储结果链表,设定一个变量做为进位标识。/*......
  • 1. 两数之和 unordered_map使用
    https://leetcode.cn/problems/two-sum/ 给定一个整数数组nums 和一个整数目标值target,请你在该数组中找出和为目标值target 的那 两个 整数,并返回它们的数组......
  • 代码随想录算法Day36 | 435. 无重叠区间 , 763.划分字母区间, 56. 合并区间
    435.无重叠区间题目链接:435.无重叠区间-力扣(LeetCode)思路这道题首先进行排序,使得相邻的区间紧挨在一起。按左边界或者右边界都可以。其次定义一个变量result记录重......
  • leetcode刷题--两数之和/两数相加/关于class/enumerate()函数/TypeError: creat() mis
    Python中的self详细解析-初识CV的文章-知乎https://zhuanlan.zhihu.com/p/356325860关于classleetcode里面给出的class部分是不能删除的,否则会执行出错。关于class......
  • 代码随想录算法训练营Day36 贪心算法
    代码随想录算法训练营代码随想录算法训练营Day36贪心算法|435.无重叠区间763.划分字母区间56.合并区间435.无重叠区间题目链接:435.无重叠区间给定一个区间的集......
  • 两数相加
    给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和......
  • 第18题. 四数之和
    题意:给定一个包含 n个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素a,b,c 和d ,使得 a+b+c+d 的值与 target 相等?找出所有满足条件......
  • 两数之和
    给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个......
  • 代码随想录算法训练营第七天 | 454. 四数相加 II、383. 赎金信、
    454.四数相加IIclassSolution{public:intfourSumCount(vector<int>&nums1,vector<int>&nums2,vector<int>&nums3,vector<int>&nums4){unord......