題目:3025. 人員站位的方案數 I
思路:排序,時間復雜度0(n^2)。
將數組points里的元素先按橫坐標x升序排序,縱坐標y降序排序。第一層for循環枚舉左上角的點,第二層for循環枚舉右下角的點。細節看注釋。
C++版本:
class Solution {
public:typedef pair<int,int> PII;static bool cmp(PII a,PII b){if(a.first==b.first) return b.second<a.second;return a.first<b.first;}int numberOfPairs(vector<vector<int>>& points) {vector<PII> v;for(auto item: points){v.push_back({item[0],item[1]});}// 將數組points里的元素先按橫坐標x升序排序,縱坐標y降序排序sort(v.begin(),v.end(),cmp);int n=v.size();// 答案int ans=0;// 第一層for循環枚舉左上角的點for(int i=0;i<n;i++){// 右下角的點不能低于mx,否則會覆蓋之前的點int mx=INT_MIN;// 第二層for循環枚舉右下角的點for(int j=i+1;j<n;j++){if(v[i].first<=v[j].first && v[i].second>=v[j].second && v[j].second>mx){ans++;mx=v[j].second;} }}return ans;}
};
JAVA版本:
class Solution {public int numberOfPairs(int[][] points) {Arrays.sort(points,(a,b) -> a[0]!=b[0] ? a[0]-b[0]:b[1]-a[1] );int ans=0;int n=points.length;for(int i=0;i<n;i++){int mx=Integer.MIN_VALUE;for(int j=i+1;j<n;j++){if(points[i][1]>=points[j][1]&&points[j][1]>mx){ans++;mx=points[j][1];}}}return ans;}
}
GO版本:
func numberOfPairs(points [][]int) int {slices.SortFunc(points,func(a,b []int)int{return cmp.Or(a[0]-b[0],b[1]-a[1])})ans:=0n:=len(points)for i:=0;i<n;i++ {mx:=math.MinIntfor j:=i+1;j<n;j++ {if points[i][1]>=points[j][1] && points[j][1]>mx {ans++mx=points[j][1]}}}return ans
}