Given an absolute path for a file (Unix-style), simplify it.
For example,
path =
"/home/", => "/home"path =
"/a/./b/../../c/", => "/c"Corner Cases:
- Did you consider the case where path =
"/../"?
In this case, you should return"/". - Another corner case is the path might contain multiple slashes
'/'together, such as"/home//foo/".
In this case, you should ignore redundant slashes and return"/home/foo".
Solution #1, using stack
'/' skip
'.' ignore/continue
'..' pop stack
class Solution {
public:
string simplifyPath(string path) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int i=0;
stack<string> s;
while (i < path.length()) {
while (path[i] == '/' && i < path.length()) { // skip '/'
i++;
}
if (i == path.length()) break; // if string ends wiht '/'
int start = i;
while (path[i] != '/' && i < path.length()) { // get end point of sub path
i++;
}
string elem = path.substr(start,i - start);
if (elem == ".") {
continue;
}
if (elem == "..") {
if (!s.empty()) {
s.pop();
}
continue;
}
s.push(elem);
}
if (s.empty()) {
return "/";
}
string ret;
while (!s.empty()) {
string temp = "/" + s.top();
ret = temp + ret;
s.pop();
}
return ret;
}
};
Solution #2, using two/three pointersto be continued
Set Matrix Zeroes
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
Follow up: Did you use extra space?
A straight forward solution using O(mn) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?
---------------------------------------A straight forward solution using O(mn) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?
Solution #1, O(m+n) space
class Solution {
public:
void setZeroes(vector<vector<int> > &matrix) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int m = matrix.size();
int n = matrix[0].size();
vector<bool> row(m,false);
vector<bool> col(n,false);
if (m != 1 || n != 1) {
// find 0
for (int i=0;i<m;i++) {
for (int j=0;j<n;j++) {
if (matrix[i][j] == 0) {
row[i] = true;
col[j] = true;
}
}
}
// set to 0
for (int i=0;i<m;i++) {
for (int j=0;j<n;j++) {
if (row[i] || col[j]) {
matrix[i][j] = 0;
}
}
}
}
}
};
Solution #2, in spaceinstead of allocating two vectors, using the first row and column to store the zero row/col
class Solution {
public:
void setZeroes(vector<vector<int> > &matrix) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
bool rowZero = false, colZero = false;
int rows = matrix.size();
int cols = matrix[0].size();
// check first row
for (int i=0;i<cols;i++) {
if (matrix[0][i] == 0) {
rowZero = true;
}
}
// check first column
for (int i=0;i<rows;i++) {
if (matrix[i][0] == 0) {
colZero = true;
}
}
for (int i=1;i<rows;i++) {
for (int j=1;j<cols;j++) {
if (matrix[i][j] == 0) {
matrix[0][j] = 0;
matrix[i][0] = 0;
}
}
}
for (int i=1;i<rows;i++) {
for (int j=1;j<cols;j++) {
if (matrix[0][j] == 0 || matrix[i][0] == 0) {
matrix[i][j] = 0;
}
}
}
// if first row has 0
if (rowZero) {
for (int i=0;i<cols;i++) {
matrix[0][i] = 0;
}
}
// if first col has 0
if (colZero) {
for (int i=0;i<rows;i++) {
matrix[i][0] = 0;
}
}
}
};
No comments:
Post a Comment