Leetcode刷题——查找与排序部分题目汇总(二)

157 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

查找遍历

917. 仅仅反转字母

题目

给你一个字符串 s ,根据下述规则反转字符串:

所有非英文字母保留在原有位置。 所有英文字母(小写或大写)位置反转。 返回反转后的 s 。

示例 1:

输入:s = "ab-cd" 输出:"dc-ba"

示例 2:

输入:s = "a-bC-dEf-ghIj" 输出:"j-Ih-gfE-dCba"

示例 3:

输入:s = "Test1ng-Leet=code-Q!" 输出:"Qedo1ct-eeLg=ntse-T!"

提示

1 <= s.length <= 100 s 仅由 ASCII 值在范围 [33, 122] 的字符组成 s 不含 '"' 或 '\'

来源:力扣(LeetCode)

链接:leetcode-cn.com/problems/re…

分析

设置双指针,当两个指针都指向字母时发生交换

代码

class Solution {
public:
    string reverseOnlyLetters(string s) {
        int left=0, right=s.size()-1;
        while(left >= 0 && left < s.size() && !isalpha(s[left]))left++;
        while(right >= 0 && right < s.size() && !isalpha(s[right]))right--;
        // cout<<left<<" "<<right<<endl;
        while(left < right && left >= 0 && left < s.size() && right >= 0 && right < s.size()){
            // cout<<left<<" "<<right<<endl;
            char tmp = s[left];
            s[left] = s[right];
            s[right] = tmp;
            left++;
            right--;
            while(!isalpha(s[left]))left++;
            while(!isalpha(s[right]))right--;
        }
        return s;
    }
};

1725. 可以形成最大正方形的矩形数目

题目 给你一个数组 rectangles ,其中 rectangles[i] = [li, wi] 表示第 i 个矩形的长度为 li 、宽度为 wi 。

如果存在 k 同时满足 k <= li 和 k <= wi ,就可以将第 i 个矩形切成边长为 k 的正方形。例如,矩形 [4,6] 可以切成边长最大为 4 的正方形。

设 maxLen 为可以从矩形数组 rectangles 切分得到的 最大正方形 的边长。

请你统计有多少个矩形能够切出边长为 maxLen 的正方形,并返回矩形 数目 。

示例 1:

输入:rectangles = [[5,8],[3,9],[5,12],[16,5]] 输出:3 解释:能从每个矩形中切出的最大正方形边长分别是 [5,3,5,5] 。 最大正方形的边长为 5 ,可以由 3 个矩形切分得到。

示例 2:

输入:rectangles = [[2,3],[3,7],[4,3],[3,7]] 输出:3

提示:

1 <= rectangles.length <= 1000 rectangles[i].length == 2 1 <= li, wi<= 109 li != wi

来源:力扣(LeetCode)

链接:leetcode-cn.com/problems/nu…

代码

class Solution {
public:
    int countGoodRectangles(vector<vector<int>>& rectangles) {
        int maxn=0, cnt=0;
        for(auto &a:rectangles){
            int tmp = min(a[0], a[1]);
            if(tmp > maxn){
                maxn = tmp;
                cnt=1;
            }else if(tmp == maxn){
                cnt++;
            }
        }
        return cnt;
    }
};

排序

1996. 游戏中弱角色的数量

题目

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

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

返回 弱角色 的数量。

示例 1:

输入:properties = [[5,5],[6,3],[3,6]]
输出:0
解释:不存在攻击和防御都严格高于其他角色的角色。

示例 2:

输入:properties = [[2,2],[3,3]]
输出:1
解释:第一个角色是弱角色,因为第二个角色的攻击和防御严格大于该角色。

示例 3:

输入:properties = [[1,5],[10,4],[4,3]]
输出:1
解释:第三个角色是弱角色,因为第二个角色的攻击和防御严格大于该角色。

提示:

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

来源:力扣(LeetCode)

链接:leetcode-cn.com/problems/th…

分析

按照攻击力递减,如果攻击力相同就按防御力递增排序。排序完成后从左向右遍历,记录左侧最高的防御力,如果当前防御力低于之前的防御力和攻击力即严格小,否则跟新当前的防御力和攻击力

代码

class Solution {
public:
    int numberOfWeakCharacters(vector<vector<int>>& properties) {
        sort(properties.begin(), properties.end(),[](const vector<int> a, const vector<int> b){
            return a[0]==b[0] ? a[1] < b[1] : a[0] > b[0];
        });
        int am=properties[0][0], dm=properties[0][1];
        int cnt=0;
        for(auto &p:properties){
            if(p[1] < dm){
                if(p[0] < am){
                    cnt++;
                }
            }else{
                dm = p[1];
                am = p[0];
            }
        }
        return cnt;
    }
};