首页 > 其他分享 >leetcode(2)

leetcode(2)

时间:2023-04-25 10:34:35浏览次数:33  
标签:map const int class ClassA hash leetcode


Given  n  points on a 2D plane, find the maximum number of points that lie on the same straight line.
在一条直线上最多的点。
理解错了:理解成一条直线上距离最长的点(自己见过类似题,务必审题要细!!!!)

4.1 hash_map和map的区别在哪里?

构造函数。hash_map需要hash函数,等于函数;map只需要比较函数(小于函数). 
存储结构。hash_map采用hash表存储,map一般采用红黑树(RB Tree)实现。因此其内存数据结构是不一样的。

4.2 什么时候需要用hash_map,什么时候需要用map?

总体来说,hash_map 查找速度会比map快,而且查找速度基本和数据量大小无关,属于常数级别;而map的查找速度是log(n)级别。并不一定常数就比log(n) 小,hash还有hash函数的耗时,明白了吧,如果你考虑效率,特别是在元素达到一定数量级时,考虑考虑hash_map。但若你对内存使用特别严格,希望程序尽可能少消耗内存,那么一定要小心,hash_map可能会让你陷入尴尬,特别是当你的hash_map对象特别多时,你就更无法控制了,而且hash_map的构造速度较慢。

现在知道如何选择了吗?权衡三个因素: 查找速度, 数据量, 内存使用。

这里还有个关于hash_map和map的小故事

4.3 如何在hash_map中加入自己定义的类型?
你只要做两件事, 定义hash函数,定义等于比较函数。下面的代码是一个例子:

-bash-2.05b$ cat my.cpp
 #include 
 #include 
 #include  using namespace std;
 //define the class
 class ClassA{
     public:
         ClassA(int a):c_a(a){}
         int getvalue()const { return c_a;}
         void setvalue(int a){c_a=a;}
     private:
         int c_a;
 };  //1 define the hash function
 struct hash_A{
         size_t operator()(const class ClassA & A)const{
                 // return hash(classA.getvalue());
                 return A.getvalue();
         }
 };  //2 define the equal function
 struct equal_A{
         bool operator()(const class ClassA & a1, const class ClassA & a2)const{
                 return a1.getvalue() == a2.getvalue();
         }
 };  int main()
 {
         hash_map hmap;
         ClassA a1(12);
         hmap[a1]="I am 12";
         ClassA a2(198877);
         hmap[a2]="I am 198877";
         
         cout<<hmap[a1]<<endl;
         cout<<hmap[a2]<<endl;
         return 0;
 }
 -bash-2.05b$ make my
 c++ -O -pipe -march=pentiumpro my.cpp -o my
 -bash-2.05b$ ./my
 I am 12
 I am 198877</hmap[a2]<<endl;
 </hmap[a1]<<endl

;

4.4如何用hash_map替换程序中已有的map容器?

这个很容易,但需要你有良好的编程风格。建议你尽量使用typedef来定义你的类型: 
typedef map KeyMap;
当你希望使用hash_map来替换的时候,只需要修改:
typedef hash_map KeyMap;
其他的基本不变。当然,你需要注意是否有Key类型的hash函数和比较函数。

4.5为什么hash_map不是标准的?

具体为什么不 是标准的,我也不清楚,有个解释说在STL加入标准C++之时,hash_map系列当时还没有完全实现,以后应该会成为标准。如果谁知道更合理的解释,也希望告诉我。但我想表达的是,正是因为hash_map不是标准的,所以许多平台上安装了g++编译器,不一定有hash_map的实现。我就遇到了这样的例子。因此在使用这些非标准库的时候,一定要事先测试。另外,如果考虑到平台移植,还是少用为佳。

4.6 有学习使用hash_map的建议吗?

hash中文是哈希,也成为散列,听见别人说散列容器不要埋怨自己孤陋寡闻。了解hash系列,你还可以看看这篇文章:effective STL 25: 熟悉非标准散列容器, 另外建议查看源代码。如果还有问题,那么你可以在STL论坛上提问,会有高手回答你的。



此处)折叠或打开



    1. /**
    2. * Definition for a point.
    3. * struct Point {
    4. * int x;
    5. * int y;
    6. * Point() : x(0), y(0) {}
    7. * Point(int a, int b) : x(a), y(b) {}
    8. * };
    9. */
    10.  
    11. class Solution {
    12. public:
    13. int maxPoints(vector<Point> &points) {
    14. int size = points.size();
    15. if(size == 0)
    16. ;
    17. else if(size == 1)
    18. ;
    19.               
    20. int ret = 0;
    21. for(int i = 0;i<size;i++){
    22.               
    23. int curmax = 1;
    24. <double,int>mp;
    25. int vcnt = 0; //垂直点
    26. int dup = 0; //重复点
    27. for(int j = 0;j<size;j++){
    28.                   
    29. if(j!=i){
    30. = points[i].x - points[j].x;
    31. = points[i].y - points[j].y;
    32. if(x1 == 0 && y1 == 0){ //重复
    33. ++;
    34. }else if(x1 == 0){ //垂直
    35. if(vcnt == 0)
    36. = 2;
    37. else
    38. ++;
    39. = max(vcnt,curmax);
    40. }else{
    41. = y1/x1; //斜率
    42. if(mp[k] == 0)
    43. [k] = 2;
    44. else
    45. [k]++;
    46. = max(mp[k],curmax);
    47. } 
    48. }
    49. }
    50. = max(ret,curmax+dup); 
    51. }
    52. ;
    53.           
    54. }
    55. };


    标签:map,const,int,class,ClassA,hash,leetcode
    From: https://blog.51cto.com/u_16087831/6223547

    相关文章

    • 【DP】LeetCode 1277. 统计全为 1 的正方形子矩阵
      题目链接1277.统计全为1的正方形子矩阵思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以前i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1......
    • 【LeetCode动态规划#12】详解买卖股票I~IV,经典dp题型
      买卖股票的最佳时机力扣题目链接(opensnewwindow)给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔......
    • #yyds干货盘点# LeetCode程序员面试金典:搜索插入位置
      题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为O(logn)的算法。 示例1:输入:nums=[1,3,5,6],target=5输出:2示例 2:输入:nums=[1,3,5,6],target=2输出:1示......
    • #yyds干货盘点# LeetCode面试题:分隔链表
      1.简述:给你一个链表的头节点head和一个特定值x,请你对链表进行分隔,使得所有小于x的节点都出现在大于或等于x的节点之前。你应当保留两个分区中每个节点的初始相对位置。 示例1:输入:head=[1,4,3,2,5,2],x=3输出:[1,2,2,4,3,5]示例2:输入:head=[2,1],x=2输出:[1,2......
    • [Leetcode]返回链表开始入环的第一个节点
      力扣链接思路一:快慢指针法一个指针从相遇点走,一个指针从起始点走,会在入口点相遇.最终代码:/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*detectCycle(structListNode*head){......
    • LeetCode 40.组合总和II
      1.题目:给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。注意:解集不能包含重复的组合。示例 1:输入:candidates= [10,1,2,7,6,1,5],target= ......
    • leetcode 550 游戏玩法分析IV
      游戏玩法分析 selectround(avg(a.event_dateisnotnull),2)asfractionfrom(selectplayer_id,min(event_date)asevent_datefromactivitygroupbyplayer_id)aspleftjoinactivityasaonp.player_id=a.player_idanda.event_date=date_......
    • 【DP】LeetCode 221. 最大正方形
      题目链接221.最大正方形思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以前i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1前i个元素(即nu......
    • LeetCode 周赛 342(2023/04/23)容斥原理、计数排序、滑动窗口、子数组 GCB
      本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。前天刚举办2023年力扣杯个人SOLO赛,昨天周赛就出了一场Easy-Easy-Medium-Medium的水场,不得不说LeetCode是懂礼数的......
    • leetcode343. 整数拆分
      classSolution{public:intf[60];//f[i]记录i能拆出的最大乘积intintegerBreak(intn){for(inti=2;i<=n;i++)for(intj=1;j<i;j++)//枚举最后一个拆出的数字,这里不能只循环到i/2f[i]=max(f[i],max(j*f[i-j],j*(i-j)));......