Y*o
3 楼
好像分成小矩阵, 加上非负数prune, 再组合,我比较菜,大神来讲讲吧。
q*0
4 楼
感觉和leetcode解数独差不多。从第一行到最后一行,逐个试探,注意剪枝,经典的回
溯。
溯。
u*8
5 楼
谁会?是什么graph cut么?求大牛来解。
u*8
6 楼
我就是想大神跟我说说,fang面试onsite轮,遇到这一题,是我水,还是这题难,
死也死个明白。
死也死个明白。
u*8
9 楼
更新:我非常想知道,如何做这一题。今天HR来了电话,口气很冷淡的拒绝了。我问什
么都不说。就说12个月,block期。然后我说,这最后一题,实在不是1小时做得出来。
他也就说,有个survey,其余没办法。
求有大神丢个code上来,跑下来,答案出来。心服口服。给伪币。
给你矩阵的每行和每列的和。要你把矩阵的可能都算出来。矩阵都是非负数。
这一题,1小时,搞得定么?
么都不说。就说12个月,block期。然后我说,这最后一题,实在不是1小时做得出来。
他也就说,有个survey,其余没办法。
求有大神丢个code上来,跑下来,答案出来。心服口服。给伪币。
给你矩阵的每行和每列的和。要你把矩阵的可能都算出来。矩阵都是非负数。
这一题,1小时,搞得定么?
Y*o
10 楼
好像分成小矩阵, 加上非负数prune, 再组合,我比较菜,大神来讲讲吧。
q*0
11 楼
感觉和leetcode解数独差不多。从第一行到最后一行,逐个试探,注意剪枝,经典的回
溯。
溯。
u*8
12 楼
谁会?是什么graph cut么?求大牛来解。
u*8
13 楼
我就是想大神跟我说说,fang面试onsite轮,遇到这一题,是我水,还是这题难,
死也死个明白。
死也死个明白。
c*y
16 楼
+1,对n^2范围的点逐一试探,递归下去,如果发现rowsum[i]或colsum[j]比当前累积
的数字小了就失败返回。或者行列剩下的数(假设有范围0-255)不够凑齐sum,也失败
返回。感觉这是二维图像重建,要是有特别快的方法意义感觉蛮大的,这个只能说是暴
力搜索。为了找所有的解感觉只能这样了吧,毕竟解空间那么大。别的算法一小时也不
现实。
如果没有范围的话,那每个点只能从1到min(rowsum[i], colsum[j]循环了。
如果不限制整数的话,那我就没辙了,没准是无穷多解,这个可能得先问清楚。
【在 q*******0 的大作中提到】
: 感觉和leetcode解数独差不多。从第一行到最后一行,逐个试探,注意剪枝,经典的回
: 溯。
的数字小了就失败返回。或者行列剩下的数(假设有范围0-255)不够凑齐sum,也失败
返回。感觉这是二维图像重建,要是有特别快的方法意义感觉蛮大的,这个只能说是暴
力搜索。为了找所有的解感觉只能这样了吧,毕竟解空间那么大。别的算法一小时也不
现实。
如果没有范围的话,那每个点只能从1到min(rowsum[i], colsum[j]循环了。
如果不限制整数的话,那我就没辙了,没准是无穷多解,这个可能得先问清楚。
【在 q*******0 的大作中提到】
: 感觉和leetcode解数独差不多。从第一行到最后一行,逐个试探,注意剪枝,经典的回
: 溯。
p*2
17 楼
大概写了半个小时,估计onsite直接就跪了。
public class Solution {
int m;
int n;
int[] rows;
int[] cols;
List
public class Solution {
int m;
int n;
int[] rows;
int[] cols;
List
- > all = new ArrayList<>();
List
List
for(int[] arr : matrix) {
StringBuilder sb = new StringBuilder();
for(int i : arr) {
if(sb.length() > 0) {
sb.append(",");
}
sb.append(i);
}
al.add(sb.toString());
}
return al;
}
boolean valicate(int[][] matrix) {
int[] r = new int[m];
int[] c = new int[n];
for(int i=0; i
c[j] += matrix[i][j];
if(i == m-1 && cols[j] != c[j]) {
return false;
}
}
if(rows[i] != r[i]) {
return false;
}
}
return true;
}
void dfs(int[][] matrix, int index) {
if(index == m*n) {
if(valicate(matrix)) {
all.add(serialize(matrix));
}
return;
}
int x = index/n;
int y = index%n;
int row = 0;
for(int j=0; j
}
int col = 0;
for(int i=0; i
}
for(int num = 1; num <= Math.min(rows[x]-row, cols[y]-col); num++) {
matrix[x][y] = num;
dfs(matrix, index+1);
}
matrix[x][y] = 0;
}
List
- > composeMatrix(int m, int n, int[] rows, int[] cols) {
this.m = m;
this.n = n;
this.rows = rows;
this.cols = cols;
all.clear();
int[][] matrix = new int[m][n];
dfs(matrix, 0);
return all;
}
}
f*e
19 楼
用递归,很好写!f(m,n){一维递归里面call f(m-1, n)}
明天我写个mutual recursive的。
明天我写个mutual recursive的。
e*2
21 楼
class solution {
public:
void aux(vector& rows, vector& cols, int m, int n, vector<
vector>& temp, vector>>& res)
{
if (m == rows.size() - 1 && n == cols.size() - 1) {
if (rows[m] >= 0 && cols[n] >= 0 && rows[m] == cols[n]) {
temp[m][n] = rows[m];
res.push_back(temp);
}
}
else{
int start = n == cols.size() - 1 ? rows[m] : 0;
for (int i = start; i <= min(rows[m], cols[n]); i++) {
temp[m][n] = i;
rows[m] -= i;
cols[n] -= i;
if (n + 1 < cols.size())
aux(rows, cols, m, n + 1, temp, res);
else
aux(rows, cols, m + 1, 0, temp, res);
rows[m] += i;
cols[n] += i;
}
}
}
void f(vector& rows, vector& cols, vector>>
& res)
{
vector> temp(rows.size(), vector(cols.size()));
aux(rows, cols, 0, 0, temp, res);
}
};
public:
void aux(vector
vector
{
if (m == rows.size() - 1 && n == cols.size() - 1) {
if (rows[m] >= 0 && cols[n] >= 0 && rows[m] == cols[n]) {
temp[m][n] = rows[m];
res.push_back(temp);
}
}
else{
int start = n == cols.size() - 1 ? rows[m] : 0;
for (int i = start; i <= min(rows[m], cols[n]); i++) {
temp[m][n] = i;
rows[m] -= i;
cols[n] -= i;
if (n + 1 < cols.size())
aux(rows, cols, m, n + 1, temp, res);
else
aux(rows, cols, m + 1, 0, temp, res);
rows[m] += i;
cols[n] += i;
}
}
}
void f(vector
& res)
{
vector
aux(rows, cols, 0, 0, temp, res);
}
};
e*2
22 楼
//recurse entry by entry; if any constraint is violated, return
class solution {
public:
void aux(vector& rows, vector& cols, int m, int n, vector<
vector>& temp, vector>>& res)
{
if (m == rows.size() - 1) {
if (accumulate(cols.begin(), cols.end(), 0) == rows.back()) {
temp.back() = cols;
res.push_back(temp);
}
}
else{
int start = n == cols.size() - 1 ? rows[m] : 0;
for (int i = start; i <= min(rows[m], cols[n]); i++) {
temp[m][n] = i; rows[m] -= i; cols[n] -= i;
n + 1 < cols.size()?aux(rows, cols, m, n + 1, temp, res):aux
(rows, cols, m + 1, 0, temp, res); // recurse to next entry
rows[m] += i; cols[n] += i;
}
}
}
void f(vector& rows, vector& cols, vector>>
& res) {
if(accumulate(cols.begin(), cols.end(), 0) != accumulate(rows.begin(),
rows.end(), 0)) return;
vector> temp(rows.size(), vector(cols.size()));
aux(rows, cols, 0, 0, temp, res);
}
};
【在 e********2 的大作中提到】
: class solution {
: public:
: void aux(vector& rows, vector& cols, int m, int n, vector<
: vector>& temp, vector>>& res)
: {
: if (m == rows.size() - 1 && n == cols.size() - 1) {
: if (rows[m] >= 0 && cols[n] >= 0 && rows[m] == cols[n]) {
: temp[m][n] = rows[m];
: res.push_back(temp);
: }
class solution {
public:
void aux(vector
vector
{
if (m == rows.size() - 1) {
if (accumulate(cols.begin(), cols.end(), 0) == rows.back()) {
temp.back() = cols;
res.push_back(temp);
}
}
else{
int start = n == cols.size() - 1 ? rows[m] : 0;
for (int i = start; i <= min(rows[m], cols[n]); i++) {
temp[m][n] = i; rows[m] -= i; cols[n] -= i;
n + 1 < cols.size()?aux(rows, cols, m, n + 1, temp, res):aux
(rows, cols, m + 1, 0, temp, res); // recurse to next entry
rows[m] += i; cols[n] += i;
}
}
}
void f(vector
& res) {
if(accumulate(cols.begin(), cols.end(), 0) != accumulate(rows.begin(),
rows.end(), 0)) return;
vector
aux(rows, cols, 0, 0, temp, res);
}
};
【在 e********2 的大作中提到】
: class solution {
: public:
: void aux(vector
: vector
: {
: if (m == rows.size() - 1 && n == cols.size() - 1) {
: if (rows[m] >= 0 && cols[n] >= 0 && rows[m] == cols[n]) {
: temp[m][n] = rows[m];
: res.push_back(temp);
: }
b*h
23 楼
这题写个最基本的回溯用不了20分钟吧。再加个记忆搜索,应该就够应付面试官了。
T*e
24 楼
俺还是佩服2爷和你。敢直接贴码,肚里有货。我承认我只能马后炮
地说这是combination sum的变形,2D。但第一眼我也没认出来。:)
楼主加油。
【在 e********2 的大作中提到】
: //recurse entry by entry; if any constraint is violated, return
: class solution {
: public:
: void aux(vector& rows, vector& cols, int m, int n, vector<
: vector>& temp, vector>>& res)
: {
: if (m == rows.size() - 1) {
: if (accumulate(cols.begin(), cols.end(), 0) == rows.back()) {
: temp.back() = cols;
: res.push_back(temp);
地说这是combination sum的变形,2D。但第一眼我也没认出来。:)
楼主加油。
【在 e********2 的大作中提到】
: //recurse entry by entry; if any constraint is violated, return
: class solution {
: public:
: void aux(vector
: vector
: {
: if (m == rows.size() - 1) {
: if (accumulate(cols.begin(), cols.end(), 0) == rows.back()) {
: temp.back() = cols;
: res.push_back(temp);
C*y
28 楼
我操,任何一个bi公司平时的活也碰不到这种问题吧。
相关阅读
太丢人了!一道简单的SQL题,我都没答好。找个地缝钻进去得了。我的h1b还是initial review有些Job Agent 是不是骗人的老印极端仇视中国人是有原因的 (转载)跳槽去对手公司,如何委婉地拒绝现老板问去哪家公司的问题?Tripadvisor 内推(包括国内的daodao.com)关于compenstation。大家都在那里看公司的工资啊?glassdoor么?有人能内推DropBox吗?悄声问一句FB Onsite管晚饭吗?大家有熟悉marin software这个公司吗?H1B一个公司的receipt都是一起发的吗?H1B regular 受到律师邮件受到receipt请教一个傻问题:怎么回复thankyou letter的回复OPT期间两个雇主的情况拿到了A123的offer。在犹豫要不要接?请教H1B改地址的问题junior position如何区别烙印和巴铁?如果毕业时和老板搞翻脸了,申请绿卡要求证明可以找别人么dropcam面经