你的面前有一堵方形的、由多行砖块组成的砖墙。 这些砖块高度相同但是宽度不同。你现在要画一条自顶向下的、穿过最少砖块的垂线。
砖墙由行的列表表示。 每一行都是一个代表从左至右每块砖的宽度的整数列表。
如果你画的线只是从砖块的边缘经过,就不算穿过这块砖。你需要找出怎样画才能使这条线穿过的砖块数量最少,并且返回穿过的砖块数量。
你不能沿着墙的两个垂直边缘之一画线,这样显然是没有穿过一块砖的。
示例:
输入: [[1,2,2,1], [3,1,2], [1,3,2], [2,4], [3,1,2], [1,3,1,1]] 输出: 2 解释:
提示:
- 每一行砖块的宽度之和应该相等,并且不能超过 INT_MAX。
- 每一行砖块的数量在 [1,10,000] 范围内, 墙的高度在 [1,10,000] 范围内, 总的砖块数量不超过 20,000。
/*
思路: 先确定 最少的路径 肯定出现在有缝隙的路径 , 然后找出每行中有缝隙的位置 再进行遍历所有有缝隙的路径 求得最小值
*/
class Solution {
public:
int leastBricks(vector<vector<int>>& wall) {
vector<int> wide ; // 用来存放所有路径的位置
int time = INT_MAX ; //用来存放结果最小值
vector<int>::iterator it;
for(int i = 0 ; i <wall.size();i++)
{
int w = 0 ;
for(int j = 0 ;j<wall[i].size()-1 ;j++)
{
//int w = 0 ;
w += wall[i][j] ;
it=find(wide.begin(),wide.end(),w);
if (it!=wide.end())
{
//wide中存在w值
}
else
{
wide.push_back(w); //wide中不存在w值
}
}
}
if(wide.empty()) //如果不存在有缝隙的路径 则直接返回
{
return wall.size();
}
for(int i = 0 ; i < wide.size();i++)
{
// cout<< wide[i]<<" " ;
if(time > cacuTime(wall , wide[i] ))
{
time = cacuTime(wall , wide[i]);
}
}
return time ;
}
int cacuTime(vector<vector<int>>& wall ,int wide) // 遍历所有缝隙
{
int j = 0 ,time= 0;
for(int i = 0 ; i <wall.size() ; i ++)
{
int w = 0 ;
for(int j = 0 ;j<wall[i].size() ;j++)
{
w += wall[i][j] ;
if(w == wide )
{
break ;
}
if(w>wide).
{
time++ ;
break ;
}
}
}
return time ;
}
};