Day11

每日博客Day 11

每日算法内容

1. 两数之和 - 力扣(LeetCode)

两数之和

我的第一种思路就是直接两层for循环直接暴力求解

暴力求解的方式太简单了,但是这样的解决方式很难获得面试官的青睐

class Solution {
public:
    vector twoSum(vector& nums, int target) {
        vector result;
        for(int i = 0;i

用哈希表的方式来求解问题

其实在这里也是应该要学习一下这个unordered_map的一些使用的内容和方式,作为STL的容器的内容,在使用的时候还是存在着很多的操作需要去学习的。

class Solution {
public:
    vector twoSum(vector& nums, int target) {
        unordered_map  Test;
        for(int i = 0; i < nums.size(); i++)
        {
            if(Test.find(target - nums[i]) != Test.end())
            {
                return {Test.find(target - nums[i])->second,i};
            }
            Test.insert(pair(nums[i],i));
        }
        return {};
    }
};

赎金信

这个是用数组来解决的,因为题目中给出了限制的条件,所以使用数组的效率会比较高

class Solution {
public:
	bool canConstruct(string ransomNote, string magazine) 
	{
		if (ransomNote.size() > magazine.size())	return false;
		int hash_table[26] = {};
		for (int i = 0; i

这个题目的要求我看到了之后知道大概也是使用unordered_map来解决

这是看了别人的使用的代码,但是我感觉可以再优化一下子

class Solution {
public:
	bool canConstruct(string ransomNote, string magazine)
	{
		unordered_map map;
		for (int i = 0; i < ransomNote.size(); i++)
		{
			++map[ransomNote[i]];
		}
		//在这里对randsome操作
		for (int i = 0; i < magazine.size(); i++)
		{
			--map[magazine[i]];
		}
		for (auto &i : map)
		{
			if (i.second > 0)
			{
				return false;
			}
		}
		return true;
	}
};

这是优化过的代码

代码更加的简短,同时他的可读性也更加的高

class Solution {
public:
	bool canConstruct(string ransomNote, string magazine)
	{
		unordered_map map;
		for (int i = 0; i < magazine.size(); i++) ++map[magazine[i]];
		for (int i = 0; i < ransomNote.size(); i++)
		{
			--map[ransomNote[i]];
			if (map[ransomNote[i]] < 0)	return false;
		}
		return true;
	}
};

四数之和

不是特别熟悉unordered_map的使用方式,刷算法题也当作熟悉这类STL的使用了

class Solution {
public:
	int fourSumCount(vector& nums1, vector& nums2, 
		vector& nums3, vector& nums4) {
		//第一层for循环来存放数组A和数组B元素内容
		unordered_map map;
		for (int a : nums1)
		{
			for (int b : nums2)
			{
				map[a + b]++;
			}
		}
		int count = 0;
		for (int c : nums3)
		{
			for (int d : nums4)
			{
				auto m_find = map.find(0 - (c + d));
				if (m_find !=  map.end())
				{
					count += m_find->second;
				}
			}
		}
		return count;
	}
};

unordered_map

简介

  1. unordered_map是一个将key和value关联起来的容器,它可以高效的根据单个key值查找对应的value。
  2. key值应该是唯一的,key和value的数据类型可以不相同。
  3. unordered_map存储元素时是没有顺序的,只是根据key的哈希值,将元素存在指定位置,所以根据key查找单个value时非常高效,平均可以在常数时间内完成。
  4. unordered_map查询单个key的时候效率比map高,但是要查询某一范围内的key值时比map效率低。
  5. 可以使用[]操作符来访问key值对应的value值。
#include    
#include  
#include
using namespace std;  
  
int main()
{
	unordered_map  dict; // 声明unordered_map对象
	
	// 插入数据的三种方式
	dict.insert(pair("apple",2));
	dict.insert(unordered_map::value_type("orange",3));
	dict["banana"] = 6;
	
	// 判断是否有元素
	if(dict.empty())
		cout<<"该字典无元素"<::iterator iter;
	for(iter=dict.begin();iter!=dict.end();iter++)
		cout<first<second<

你可能感兴趣的:(每日博客,哈希算法,算法)