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;
}
相关推荐
CYBEREXP20088 分钟前
MacOS M3源代码编译Qt6.8.1
c++·qt·macos
ZSYP-S27 分钟前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos30 分钟前
c++------------------函数
开发语言·c++
yuanbenshidiaos34 分钟前
C++----------函数的调用机制
java·c++·算法
唐叔在学习38 分钟前
【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
数据结构·算法·排序算法
程序员_三木42 分钟前
Three.js入门-Raycaster鼠标拾取详解与应用
开发语言·javascript·计算机外设·webgl·three.js
是小崔啊1 小时前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
ALISHENGYA1 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
数据结构·算法
tianmu_sama1 小时前
[Effective C++]条款38-39 复合和private继承
开发语言·c++
chengooooooo1 小时前
代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
算法·leetcode·职场和发展