मान लीजिए हमारे पास M x N तत्वों की एक मैट्रिक्स है, हमें मैट्रिक्स के सभी तत्वों को विकर्ण क्रम में ढूंढना है। इसलिए यदि मैट्रिक्स इस तरह है:
| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |
आउटपुट [1,2,4,7,5,3,6,8,9] होगा
हल का दृष्टिकोण
इसे हल करने के लिए हम निम्नलिखित चरणों का पालन करेंगे:
- एक सरणी
retबनाएं,row := 0, col := 0, n := पंक्ति गिनती, m := स्तंभ गिनती, down := falseसेट करें i = 0 से n-1तक:x := i, y := 0- एक सरणी
tempबनाएं while x >= 0 और y < m:matrix[x][y]कोtempमें डालें, औरxको 1 से घटाएं औरyको 1 से बढ़ाएं
- यदि
downtrue है, तोtempसरणी को उल्टा करें i = 0 से temp का आकार - 1तक,temp[i]कोretमें डालेंdown := down का उल्टा
i = 1 से m-1तक:x := n-1, y := i, एक सरणीtempबनाएंwhile x >= 0 और y < m:matrix[x][y]कोtempमें डालें औरxको 1 से घटाएं औरyको 1 से बढ़ाएं
i = 0 से temp का आकार - 1तक,temp[i]कोretमें डालेंdown := down का उल्टा
retलौटाएं।
उदाहरण
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<int> v){
cout << "[";
for(int i = 0; i < v.size(); i++){
cout << v[i] << ", ";
}
cout << "]" << endl;
}
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
vector<int> ret;
int row = 0;
int col = 0;
int n = matrix.size();
int m = n ? matrix[0].size() : 0;
bool down = false;
for(int i = 0; i < n; i++){
int x = i;
int y = 0;
vector<int> temp;
while(x >= 0 && y < m){
temp.push_back(matrix[x][y]);
x--;
y++;
}
if(down) reverse(temp.begin(), temp.end());
for(int i = 0; i < temp.size(); i++) ret.push_back(temp[i]);
down = !down;
}
for(int i = 1; i < m; i++){
int x = n - 1;
int y = i;
vector<int> temp;
while(x >= 0 && y < m){
temp.push_back(matrix[x][y]);
x--;
y++;
}
if(down) reverse(temp.begin(), temp.end());
for(int i = 0; i < temp.size(); i++) ret.push_back(temp[i]);
down = !down;
}
return ret;
}
};
int main(){
vector<vector<int>> v = {{1,2,3},{4,5,6},{7,8,9}};
Solution ob;
print_vector(ob.findDiagonalOrder(v));
}
इनपुट
[[1,2,3],[4,5,6],[7,8,9]]
आउटपुट
[1, 2, 4, 7, 5, 3, 6, 8, 9, ]