a***e 发帖数: 413 | 1 平时几乎不用c++,有没有哪位同学帮看看怎么能让这段程序通过编译?我觉得自己思
路是对了的,不知道如果面试中碰到这种情况是否影响?没觉得哪里template用错了啊
?多谢
主要是在
Point x(a,b);
std::map::iterator it=mp.find(x);
if (it==mp.end())
mp.insert(std::pair(x,1));
else
mp[x]++;
/**
* Definition for a point.
* struct Point {
* int x;
* int y;
* Point() : x(0), y(0) {}
* Point(int a, int b) : x(a), y(b) {}
* };
*/
class Solution {
public:
int maxPoints(vector &points) {
int n=points.size();
if (n==0) return 0;
int a=0,b=0;
map mp;
for (int i=0; i
{
for (int j=i+1;j
{
a=(points[j].y-points[i].y)/(points[j].x-points[j].x);
b=points[j].y-(points[i].y-points[j].y)*points[j].x/(points[
i].x-points[j].x);
Point x(a,b);
std::map::iterator it=mp.find(x);
if (it==mp.end())
mp.insert(std::pair(x,1));
else
mp[x]++;
}
}
int res=-1;
for(auto it = mp.begin(); it != mp.end(); it++)
{
if (it->second>res)
{
res=it->second;
}
}
return res;
}
}; | U***A 发帖数: 849 | | r*******e 发帖数: 971 | 3 哥们,你这个算法有问题啊。
1 为啥用map不用unordered_map? map 是棵树啊,后一个才是hashMap。不过这个其实
无所谓。
2. a=(points[j].y-points[i].y)/(points[j].x-points[j].x);
结果不是整数啊,会被强制取整的啊,这样不好。
下一行也是。
3. x 是个Point啊,我记得map活着unordered——map 对[]的重载只有在x是
primitive type才行。 | r*******e 发帖数: 971 | 4 楼上的楼上(2楼)说的对。
【在 r*******e 的大作中提到】 : 哥们,你这个算法有问题啊。 : 1 为啥用map不用unordered_map? map 是棵树啊,后一个才是hashMap。不过这个其实 : 无所谓。 : 2. a=(points[j].y-points[i].y)/(points[j].x-points[j].x); : 结果不是整数啊,会被强制取整的啊,这样不好。 : 下一行也是。 : 3. x 是个Point啊,我记得map活着unordered——map 对[]的重载只有在x是 : primitive type才行。
| a***e 发帖数: 413 | 5 多谢。
改了改,还是通不过,看来得VS里面debug去了
/**
* Definition for a point.
* struct Point {
* int x;
* int y;
* Point() : x(0), y(0) {}
* Point(int a, int b) : x(a), y(b) {}
* };
*/
class Solution {
public:
int maxPoints(vector &points) {
int n=points.size();
if (n==0) return 0;
double a=0,b=0;
map, int> mp;
int x1,x2,y1,y2;
for (int i=0; i
{
for (int j=i+1;j
{
y1=points[j].y, y2=points[i].y,x1=points[j].x, x2=points[i].
x;
if (x1==x2)
{
a=0;
b=x1;
}
else
{
a=double(y1-y2)/double(x1-x2);
b=double(y2)-double(y1-y2)*x2/(x1-x2);
}
std::map,int>::iterator it=mp.find(pair<
double,double>(a,b));
if (it==mp.end())
mp.insert(std::pair,int>(pair
double>(a,b),2));
else
mp[pair(a,b)]++;
}
}
int res=1;
for(auto it = mp.begin(); it != mp.end(); it++)
{
if (it->second>res)
{
res=it->second;
}
}
return res;
}
}; | r*******e 发帖数: 971 | | a***e 发帖数: 413 | 7 看了你的解法,但是直接存斜率不行吗?是担心精度问题是吧?但是int/int 精度可能
没啥影响吧? | r*******e 发帖数: 971 | 8 你比较double值肯定不会用==吧?这里也是一样的,找key的时候可能不准。
当然我见过别人用直接存储斜率的办法,也能过。
【在 a***e 的大作中提到】 : 看了你的解法,但是直接存斜率不行吗?是担心精度问题是吧?但是int/int 精度可能 : 没啥影响吧?
| a***e 发帖数: 413 | 9 我再看了看 http://www.cplusplus.com/reference/unordered_map/unordered_map/unordered_map/
请问你怎么知道那个map不用先判断是否里面有key对应的val,直接就像你那么写?int
curr=++map[key];(我是说你那么写是对的,但我不知道哪里能找到可以那么用的说
明?)
key=0L;key+=x;key<<=32;key+=y;
//find x,then y;
int curr=++map[key];
localmax=max(curr,localmax);
不用先判断key是否存在,像下面myMap这样
int hor = points[j].x - points[i].x;
int ver = points[j].y - points[i].y;
float k = 0==hor? numeric_limits::infinity() : 1.0*
ver/hor;
if (myMap.find(k)!=myMap.end())
{
myMap[k]++;
}
else
{
myMap[k] = 1;
} |
|