首页 > 其他分享 >Day6 四数之和II,赎金信,三数之和,四数之和

Day6 四数之和II,赎金信,三数之和,四数之和

时间:2024-07-01 13:30:43浏览次数:22  
标签:四数 num nums Day6 ++ II int right left

四数之和II

 在这道题中我们要做的是寻找次数,所以在这个代码中这个次数就是value因为我们是通过key来寻找value。所以为了寻找这个次数我们需要把这个我们要找的数当做值,由此我们需要根据键来寻找值!!!

#include<iostream>
#include<unordered_map>
using namespace std;
#include<vector>
int fan_num(vector<int>&u,vector<int>&v, vector<int>&z, vector<int>&w)
{
	int cishu = 0;
	unordered_map<int, int>x;
	for (int num : u)
	{
		for (int num2 : v)
		{
			x[num+num2]++;//num+num=key ++=value  前者叫键 后者叫值 在代码中都是按照find来找键
		}
	}
	for (int num : z)
	{
		for (int num2 : w)
		{
			if (x.find(0 - num - num2) != x.end())
			{
				cishu += x[0 - num - num2];
			}
		}
	}
	return cishu;
}
int main()
{
	vector<int>u, v, z, w;
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		int num;
		cin >> num;
		u.push_back(num);
	}
	for (int i = 0; i < n; i++)
	{
		int num;
		cin >> num;
		v.push_back(num);
	}
	for (int i = 0; i < n; i++)
	{
		int num;
		cin >> num;
		z.push_back(num);
	}
	for (int i = 0; i < n; i++)
	{
		int num;
		cin >> num;
		w.push_back(num);
	}
cout<<	fan_num(u, v, z, w);
}

赎金信 

这个代码中这个我们需要看看这个不需要key和value,我们在上面的代码中我么之所以那么写是在于我们要记录次数。但是在这个赎金信中我们不需要去记录这个value的具体值,我们要做的是对其数值进行加加减减。

#include<iostream>
using namespace std;
#include<string>
bool panduan(string s1, string s2)
{
	int arr[26] = { 0 };
	if (s1 > s2)
	{
		return false;
    }
	for (int i = 0; i < s1.size(); i++)
	{
		arr[s1[i] - 'a']++;
	}
	for (int i = 0; i < s2.size(); i++)
	{
		arr[s2[i] - 'a']--;
	}
	for (int i = 0; i < 26; i++)
	{
		if (arr[i] > 0)
		{
			return false;

		}
	}
	return true;


}
int main()
{
	string s1, s2;
	cin >> s1 >> s2;
	cout<<panduan(s1, s2);
}

 三数之和

在这道题里面我认为比较重要的点在于对于去重,首先我们应该先确定我们做这道题的目标,我们这个去重是指对于这个答案去重,不是对于0 0 0去重这个答案是对的,我们设一个i这个是我们要找的与他相加和为0的值,我们为了能过够更快捷,更方便找三个数我们不应该选哈希方法,这个哈希法与我们前面写的两个数的和像。

#include<iostream>
#include<algorithm>
using namespace std;
#include<vector>
vector<vector<int>>chazhao(vector<int>u)
{
	vector<vector<int>>v;
	sort(u.begin(), u.end());
	for (int i = 0; i < u.size(); i++)
	{
		if (u[i] > 0)
		{
			return v;
		}
		if (i>0&&u[i] == u[i - 1])
		{
			//i++
			continue;//这个地方得这么写
		}
		int left = i + 1;
		int right = u.size() - 1;
		while (left < right)
		{
			if (u[left] + u[right] + u[i] > 0)
			{
				right--;
			}
			else	if (u[left] + u[right] + u[i] < 0)
			{
				left++;
			}
			else
			{
				v.push_back({ u[left],u[i],u[right] });
				while (left < right && u[left] == u[left + 1])left++;
				while (left < right && u[right] == u[right - 1])right--;
				left++;
				right--;
			}
		}
	}
	return v;
}
int main()
{
	int n;
	cin >> n;
	vector<int>u;
	for (int i = 0; i < n; i++)
	{
		int num;
		cin >> num;
		u.push_back(num);
	}
	vector<vector<int>>v=chazhao(u);
	for (auto num : v)
	{
		for (int num2 : num)
		{
			cout << num2 << " ";
		}
		cout << endl;
	}
	
}

 四数之和

 

 这个地方一定要仔细思考哦~~~~

#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>
vector<vector<int>>chazhao(vector<int>u,int target)
{
	vector<vector<int>>v;
	sort(u.begin(), u.end());
	for (int k = 0; k < u.size(); k++)
	{
		if (u[k] > target && u[k] >= 0)
		{
			break;
		}
		if (k > 0 && u[k] == u[k - 1])continue;
		for (int i = k + 1; i < u.size(); i++)
		{
			if (u[k]+u[i] > target && u[k]+u[i] >= 0)
			{
				break;
			}
			if (i > k + 1 && u[i] == u[i - 1])
			{
			//	break;
				continue;
			}
			int left = i + 1;
			int right = u.size() - 1;
			while (left < right)
			{
				if (u[k] + u[i] + u[left] + u[right] > target)
				{
					right--;
				}
				else if (u[k] + u[i] + u[left] + u[right] < target)
				{
					left++;
				}
				else
				{
					v.push_back({ u[k],u[i],u[left],u[right] });
					v.push_back({ u[left],u[i],u[right] });
					while (left < right && u[left] == u[left + 1])left++;
					while (left < right && u[right] == u[right - 1])right--;
					left++;
					right--;
				}
			}

		}

	}
		
	return v;
}
int main()
{
	int tar;
	cin >> tar;
	int n;
	cin >> n;
	vector<int>u;
	for (int i = 0; i < n; i++)
	{
		int num;
		cin >> num;
		u.push_back(num);
	}

	vector<vector<int>>v = chazhao(u,tar);
	for (auto num : v)
	{
		for (int num2 : num)
		{
			cout << num2 << " ";
		}
		cout << endl;
	}
}

上面这个代码虽然有点问题,但是还没找到:(

下面这个正确

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

vector<vector<int>> fourSum(vector<int>& nums, int target) {
    vector<vector<int>> result;
    sort(nums.begin(), nums.end());
    
    for (int k = 0; k < nums.size(); k++) {
        // 剪枝处理
        if (nums[k] > target && target >= 0) {
            break;
        }
        // 对nums[k]去重
        if (k > 0 && nums[k] == nums[k - 1]) {
            continue;
        }
        for (int i = k + 1; i < nums.size(); i++) {
            // 2级剪枝处理
            if (nums[k] + nums[i] > target && target >= 0) {
                break;
            }
            // 对nums[i]去重
            if (i > k + 1 && nums[i] == nums[i - 1]) {
                continue;
            }
            int left = i + 1;
            int right = nums.size() - 1;
            while (right > left) {
                long long sum = (long long) nums[k] + nums[i] + nums[left] + nums[right];
                if (sum > target) {
                    right--;
                } else if (sum < target) {
                    left++;
                } else {
                    result.push_back({nums[k], nums[i], nums[left], nums[right]});
                    // 对nums[left]和nums[right]去重
                    while (right > left && nums[right] == nums[right - 1]) right--;
                    while (right > left && nums[left] == nums[left + 1]) left++;
                    // 找到答案时,双指针同时收缩
                    right--;
                    left++;
                }
            }
        }
    }
    return result;
}

int main() {
    int tar, n;
    cout << "请输入目标值: ";
    cin >> tar;
    cout << "请输入数组的大小: ";
    cin >> n;
    vector<int> u(n);
    cout << "请输入数组元素: ";
    for (int i = 0; i < n; i++) {
        cin >> u[i];
    }

    vector<vector<int>> v = fourSum(u, tar);
    cout << "满足条件的四元组有: " << endl;
    for (const auto& num : v) {
        for (int num2 : num) {
            cout << num2 << " ";
        }
        cout << endl;
    }
    return 0;
}

标签:四数,num,nums,Day6,++,II,int,right,left
From: https://blog.csdn.net/lxy2966201752/article/details/140053489

相关文章

  • Day7 反转字符串,反转字符串II,替换数字
    反转字符串 #include<iostream>usingnamespacestd;#include<string>voidfanzhuan(string&s){ for(inti=0,j=s.size()-1;i<s.size()/2;i++,j--) { swap(s[i],s[j]); } cout<<s;}intmain(){ strings; cin>>s; ......
  • 力扣第213题“打家劫舍 II”
    在本篇文章中,我们将详细解读力扣第213题“打家劫舍II”。通过学习本篇文章,读者将掌握如何使用动态规划来解决这一问题,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释,以便于理解。问题描述力扣第213题“打家劫舍II”描述如下:你是一个专业的小偷,计......
  • leetCode.92. 反转链表 II
    leetCode.92.反转链表II题目思路代码/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListNode(intx):val(x),next(nullptr){}*ListNod......
  • 基于ucosii的车载电控单元
    一、项目简介   通过利用STM32F103C8、直流电机、按键、us015超声波测距模块、MPU6050、蜂鸣器、TFLCD、霍尔传感器等硬件设计一个车载电控单元,实现了手动加档、实时显示车速、超声波避障预警、车身倾斜预警以及更新固件功能,以保证行车安全。二、项目框架   三、......
  • 悟空派 & 香橙派驱动0.9英寸OLED(IIC)
    悟空派&香橙派驱动0.9寸OLED(IIC)前言​在linux核心板中,一般会引出许多GPIO引脚,方便开发者使用这些GPIO进行额外开发。在本文中使用IIC端口,驱动0.9寸OLED屏幕,显示远程SSH端口,以及CPU当前温度以及更多主板相关信息。1.开启IIC端口​在命令行输入:#具体文件根据自己系......
  • 力扣每日一题 下一个更大元素 II 单调栈 循环数组
    Problem:503.下一个更大元素II思路......
  • IIC驱动-基于EEPROM存储芯片AT24C02模块和三合一环境传感器AP3216C
    本文将基于IIC协议编写EEPROM芯片AT24C02存储芯片的IIC驱动程序,本文内容将分为三个部分:imx6ull的IIC控制器介绍,AT24C02存储芯片介绍,IIC的Linux驱动程序编写。关于IIC协议的内容与介绍这里不展开,相关资料很多,可以自行去查阅,但是这里需要注意的是,IIC协议本身就是一个协议,只是一些基......
  • 设计模式II
    建造者模式在建造者模式中,通常会定义以下接口/抽象类:抽象建造者接口(Builder):定义了构建产品各个部分的抽象方法,通常包括创建产品和设置产品各个部分的方法。具体建造者类将实现这个接口来构建产品的各个部分。产品接口(Product):定义了产品的抽象接口,通常包括产品的属性和行为。具......
  • 代码随想录算法训练营第46天 | 121. 买卖股票的最佳时机 、122.买卖股票的最佳时机II
    股票问题是一个动态规划的系列问题,前两题并不难,第三题有难度。买卖股票的最佳时机视频讲解:https://www.bilibili.com/video/BV1Xe4y1u77qhttps://programmercarl.com/0121.买卖股票的最佳时机.html/***@param{number[]}prices*@return{number}*/varmaxProfit=......
  • 代码随想录算法训练营第45天 | 198.打家劫舍 、213.打家劫舍II 、337.打家劫舍III
    今天就是打家劫舍的一天,这个系列不算难,大家可以一口气拿下。198.打家劫舍视频讲解:https://www.bilibili.com/video/BV1Te411N7SXhttps://programmercarl.com/0198.打家劫舍.html/***@param{number[]}nums*@return{number}*/varrob=function(nums){const......