C++刷题篇——04找等值元素

一、题目

二、解题思路

1、分割后放进二维数组

2、使用map,key为数值,value为其坐标

3、遍历二维数组元素,再在map中找该元素对应的value值(二维数组形式),倘若value.size为1,那直接返回-1,否则继续遍历value(二维数组),将值减去当前i,j坐标后不断比较取出最小值放进数组,放进的位置正好就是该元素对应的i,j位置

三、代码

cpp 复制代码
#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<algorithm>

using namespace std;

vector<int>split(string params) {
	vector<int>p;
	while (params.find(" ") != string::npos) {
		int found = params.find(" ");
		p.push_back(stoi(params.substr(0, found)));
		params = params.substr(found + 1);
	}
	p.push_back(stoi(params));
	return p;
}

int main() {
	string m_str;
	getline(cin, m_str);
	int m = stoi(m_str); //m行

	string n_str;
	getline(cin, n_str);
	int n = stoi(n_str); //n列

	vector<int>temp;
	vector<vector<int>>temps;
	for (int i = 0; i < m; i++) {
		string num;
		getline(cin, num);
		temp = split(num);
		temps.push_back(temp);
		temp.clear();
	}

	//key为数值,value为该值的坐标
	map<int, vector<vector<int>>>num_map;
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			vector<int>sit;
			sit.push_back(i);
			sit.push_back(j);
			num_map[temps[i][j]].push_back(sit);
			sit.clear();
		}
	}

	vector<int>res;
	vector<vector<int>>result;
	for (int i = 0; i < m; i++) { //注意此刻是遍历二维数组元素,因为便于后面减去i,j坐标后直接放进数组,放进的位置正好就是该元素对应的位置
		for (int j = 0; j < n; j++) {
			if (num_map[temps[i][j]].size() == 1) { //依次遍历二维数组key,如果其对应的value仅有一个元素,返回-1
				res.push_back(-1);
			}
			else {
				int min_distance = INT_MAX; //不确定最小值比多少少,这里就先给一个最大值,最小值的写法:INT_MIN
				for (int k = 0; k < num_map[temps[i][j]].size(); k++) {
					int distance = abs(num_map[temps[i][j]][k][0] - i) + abs(num_map[temps[i][j]][k][1] - j); //当前元素坐标就为i,j,所以直接遍历坐标相减即可
					if (distance == 0) { //排除坐标等于自己的情况
						continue;
					}
					min_distance = min(min_distance, distance);
				}
				res.push_back(min_distance); //由于依次遍历i,j,所以放进的位置也是按照顺序的
			}
		}
		result.push_back(res); //遍历完每一行后,放进二维数组
		res.clear(); //及时清空一维数组
	}

	string r = "";
	for (auto x : result) {
		for (auto y : x) {
			r += to_string(y) + ",";
		}
		r = r.substr(0, r.size() - 1) + "],[";
	}
	r = "[[" + r.substr(0, r.size() - 2) + "]";
	cout << r << endl;
	return 0;
}
相关推荐
数据小爬虫@2 小时前
深入解析:使用 Python 爬虫获取苏宁商品详情
开发语言·爬虫·python
健胃消食片片片片2 小时前
Python爬虫技术:高效数据收集与深度挖掘
开发语言·爬虫·python
王老师青少年编程3 小时前
gesp(C++五级)(14)洛谷:B4071:[GESP202412 五级] 武器强化
开发语言·c++·算法·gesp·csp·信奥赛
DogDaoDao3 小时前
leetcode 面试经典 150 题:有效的括号
c++·算法·leetcode·面试··stack·有效的括号
Coovally AI模型快速验证4 小时前
MMYOLO:打破单一模式限制,多模态目标检测的革命性突破!
人工智能·算法·yolo·目标检测·机器学习·计算机视觉·目标跟踪
一只小bit4 小时前
C++之初识模版
开发语言·c++
王磊鑫4 小时前
C语言小项目——通讯录
c语言·开发语言
钢铁男儿5 小时前
C# 委托和事件(事件)
开发语言·c#
可为测控5 小时前
图像处理基础(4):高斯滤波器详解
人工智能·算法·计算机视觉
Milk夜雨5 小时前
头歌实训作业 算法设计与分析-贪心算法(第3关:活动安排问题)
算法·贪心算法