首页 > 代码库 > leetcode-H-Index-274

leetcode-H-Index-274

输入一个数组,a[i]代表第i个篇论文有a[i]个引用,求n篇论文中引用数大于等于论文数的论文个数,即设当前有x篇论文满足要求,a[i]满足要求的条件是:a[i]>=x+1

递减排序,遍历一遍,当a[i]>=i+1时ans++,否则break,因为a[i]都不满足a[i]>=i+1,再往后遍历,a[i+1]<=a[i],且i+2>i+1,更不可能满足

这里我发现点问题:

1.起先我用得cmp(int x,int y){return x>=y;}来自定义排序规则,

出现变异错误:invalid use of non-static member function
原来是类的非静态函数是动态的,在编译时不能确定函数地址,所以在sort(a.begin(),a.end(),cmp)里只接用cmp是找不到函数的。改成静态的就行了,具体看代码注释

2.sort(a.begin(),a.end(),cmp)也有问题,RE了,打印出a来看,确实里面的元素有些被改变了如124442这种。去掉cmp之后发现又能正确的排序

怎么都想不通,以前就是这么用的没有出过错,不过以前是用于数组,这次是用于vector,肯定是vector的特性造成的,既然是RE,多半是容器容量或者迭代器问题

  1)尝试把vector容量设大一个,正常了

  2)根据1)判断可能是end()不能正确找到最后一个元素的后一个位置,所以sort(a.rbegin(),a.rend()),也能正常运行

 1 class Solution { 2 public: 3     // static bool cmp(int x,int y){ 4     //     return x>=y; 5     // } 6     int hIndex(vector<int>& citations) { 7         int len=citations.size(); 8         if(len==0) return 0; 9         //sort(citations.begin(),citations.end(),cmp);10         sort(citations.rbegin(),citations.rend());11         int ans=0;12         for(int i=0;i<len;i++){13             if(citations[i]>=i+1) ans++;14             else break;15         }16         return ans;17     }18 };

 

leetcode-H-Index-274