1996.游戏中的弱角色的数量

难度:中等

目录

一、问题描述

二、思想

1、解题思想

三、解题

1、代码实现

2、时间复杂度 and 空间复杂度

四、总结


一、问题描述

这里直接采用的是LeetCode上面的问题描述。

        你正在参加一个多角色游戏,每个角色都有两个主要属性:攻击 防御 。给你一个二维整数数组 properties ,其中 properties[i] = [attacki, defensei] 表示游戏中第 i 个角色的属性。

        如果存在一个其他角色的攻击和防御等级 都严格高于 该角色的攻击和防御等级,则认为该角色为 弱角色 。更正式地,如果认为角色 i 弱于 存在的另一个角色 j ,那么 attackj > attacki defensej > defensei

返回 弱角色 的数量。

下面给出示例:

提示:

  • 2 <= properties.length <= 105
  • properties[i].length == 2
  • 1 <= attacki, defensei <= 105

二、思想

1、解题思想

        对于每个角色,都要进行判断是否存在一个 攻击力 防御力 严格大于 他的角色,从而确定该角色是否为 弱角色 。我们可以按角色的某个属性(比如攻击值)从大到小的顺序遍历,同时记录已经遍历过的角色的 最大防御力 maxDefensive。对于当前角色 a,如果的防御值严格小于 maxDefensive,那么说明存在防御值比高的角色(记作 a),如果此时的攻击值也严格大于 b,则可以确定 弱角色

        怎么解决 a 的 攻击力 严格大于 b ,接下来就要对 攻击力相同的角色 进行分组,将 攻击力相等的为一组,并且攻击力相等的 防御力 按照从小到大排序,这样每次更新 maxDefensive 时 不会统计 攻击力相等的角色为 弱角色,那么当角色 b 的攻击力 严格小于 角色 a 的攻击力时,角色 b 相同的攻击力的角色 防御力也是 按照从小到达排序的,此时如果 角色b 的防御力< maxDefensive 那么可以推断出 b为 弱角色。

        这里解决的就是 对所有角色进行攻击力递减排序,并对攻击力相同的角色 按照防御力进行递增排序。

需要使用 sort 函数 自己写 cmp参数

        //攻击力相同的话 按照防御力从小到大排序
        //攻击力不同的话 按照攻击力从大到小排序
        sort(properties.begin(),properties.end(),[](vector<int>& a,vector<int>& b){
            return a[0] == b[0] ? (a[1]<b[1]) : a[0]>b[0];
        });

这里的 a[0]b[0] ,表示攻击力, a[1]b[1],表示防御力。

这里介绍一下 cmp 参数

cmp参数 中有两个元素 进行比较,为了区分我这里:

  • 参数 a 作为左边参数
  • 参数 b 作为右边参数

为了方便理解这里统一:a 在比较符号左边,b 在比较符号右边。

  • a<b 意思为递减
  • a>b意思为递增

完成排序之后就比较好操作了。

对于 cmp参数 怎么理解这里给出代码,可以自己复制下来运行去理解:

#include"leetcode.h"

struct nums{
	int a;
	int b;
	int c;
}n[10];

//  左边 < 右边 是从小到大 
bool cmp1(nums a, nums b) {
	if (a.a == b.a) {
		if (a.b == b.b) {
			return a.c < b.c;
		}
		else {
			return a.b < b.b;
		}
	}
	return a.a < b.a;
}
//优先按照a从小到大排序,其次按照b从小到大排序,最后按照c从小到大排序

//左边 > 右边 是从大到小
bool cmp2(nums a, nums b) {
	if (a.a == b.a) {
		if (a.b == b.b) {
			return a.c > b.c;
		}
		else {
			return a.b > b.b;
		}
	}
	return a.a > b.a;
}
//优先按照a从大到小排序,其次按照b从大到小排序,最后按照c从大到小排序
int main() {

	n[0].a = 1; n[0].b = 4; n[0].c = 5;
	n[1].a = 2; n[1].b = 6; n[1].c = 7;
	n[2].a = 3; n[2].b = 5; n[2].c = 7;
	n[3].a = 6; n[3].b = 6; n[3].c = 1;
	n[4].a = 2; n[4].b = 5; n[4].c = 3;
	n[5].a = 7; n[5].b = 2; n[5].c = 2;
	n[6].a = 1; n[6].b = 5; n[6].c = 3;
	n[7].a = 7; n[7].b = 6; n[7].c = 3;
	n[8].a = 2; n[8].b = 3; n[8].c = 4;
	n[9].a = 2; n[9].b = 4; n[9].c = 5;

	sort(n, n + 7, cmp2);
	for (auto item : n) {
		cout << item.a << "  " << item.b << "  " << item.c << endl;
	}

	system("pause");
	return 0;
}

调用 cmp1 时:

调用 cmp2 时:

 

 

三、解题

1、代码实现

class Solution {
public:
    int numberOfWeakCharacters(vector<vector<int>>& properties) {
        //攻击力相同的话 按照防御力从小到大排序
        //攻击力不同的话 按照攻击力从大到小排序
        //容器cmp 取引用可以提升效率,在leetcode 提交平台不取引用会超时⭐⭐⭐⭐⭐
        sort(properties.begin(),properties.end(),[](vector<int>& a,vector<int>& b){
            return a[0] == b[0] ? (a[1]<b[1]) : a[0]>b[0];
        });
        int maxDefensive = 0;
        int ans = 0;
        //容器cmp 取引用可以提升效率,在leetcode 提交平台不取引用会超时⭐⭐⭐⭐⭐
        for(auto& item : properties){
            if(item[1] < maxDefensive){
                ans++;
            }
            else{
                maxDefensive = item[1];
            }
        }
        return ans;
    }
};

2、时间复杂度 and 空间复杂度

时间复杂度:O(n log(n)) ,n 为数组的长度,O(n log(n))为排序使用的时间。

空间复杂度:O(log(n))n为数组长度,排序使用的栈的空间为O(log(n))

 

四、总结

        学会了 sort(x,y,cmp),中的 cmp参数的书写,sort() 函数还是很强大的,可以自己构造排序方法,对于这题来说主要就是会自己构造cmp 对所有角色进行排序,最后判断 防御力 即可。

        如果对你有什么帮助,请star ♥ 一下,收藏一下,蟹蟹啦!👇👇

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Alkaid_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值