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;
}
相关推荐
身如柳絮随风扬25 分钟前
Java中的CAS机制详解
java·开发语言
-dzk-2 小时前
【代码随想录】LC 59.螺旋矩阵 II
c++·线性代数·算法·矩阵·模拟
韩立学长2 小时前
【开题答辩实录分享】以《基于Python的大学超市仓储信息管理系统的设计与实现》为例进行选题答辩实录分享
开发语言·python
风筝在晴天搁浅2 小时前
hot100 78.子集
java·算法
Jasmine_llq2 小时前
《P4587 [FJOI2016] 神秘数》
算法·倍增思想·稀疏表(st 表)·前缀和数组(解决静态区间和查询·st表核心实现高效预处理和查询·预处理优化(提前计算所需信息·快速io提升大规模数据读写效率
超级大只老咪2 小时前
快速进制转换
笔记·算法
froginwe112 小时前
Scala 循环
开发语言
m0_706653232 小时前
C++编译期数组操作
开发语言·c++·算法
故事和你913 小时前
sdut-Java面向对象-06 继承和多态、抽象类和接口(函数题:10-18题)
java·开发语言·算法·面向对象·基础语法·继承和多态·抽象类和接口
Bruk.Liu3 小时前
(LangChain实战2):LangChain消息(message)的使用
开发语言·langchain