Leetcode——数组的遍历系列练习

485. 最大连续 1 的个数

cpp 复制代码
class Solution {
public:
    int findMaxConsecutiveOnes(vector<int>& nums) {
        // 记录最大连续1个数
        int max = 0;
        // 记录数组中存在1个数
        int sum = 0;
        // 遍历连续1个数
        int count = 0;
        for (int i = 0; i < nums.size() - 1; i++) {
            if (nums[i] == 1)
                sum++;
            if (nums[i] == nums[i + 1] && nums[i] == 1)
            {
                count++;
                if (count > max) {
                    max = count;
                }
            }
            else {
                count = 0;
            }
        }
        // 检查数组最后一个元素是否是1
        if (nums[nums.size() - 1] == 1)
        {
            sum++;
        }
        // 起始计数均设为0,若数组中存在1则实际count应多一
        if (sum > 0) {
            max++;
        }
        return max;
    }
};

本人解法非常绕,思路很乱,边界值测试好多遍才通过。学习优解答案!!

答案

cpp 复制代码
class Solution {
public:
    int findMaxConsecutiveOnes(vector<int>& nums) {
        int max = 0;
        int count = 0;
        for (int i = 0; i < nums.size(); i++) {
            // 如果是元素1则计数++
            if (nums[i] == 1)
            {
                count++;
            }
            // 不是1则不连续,对比max和count进行max更新,计数重置为0
            else {
                if (max < count)
                    max = count;
                count = 0;
            }
        }
        // 对比max和count进行max更新
        if (max < count)
            max = count;
        return max;
    }
};
};

summary:主要没有把握题目中仅有0,1两种元素对于连续的操作。

495.提莫攻击

cpp 复制代码
class Solution {
public:
    int findPoisonedDuration(vector<int>& timeSeries, int duration) {
        int sum = 0;
        // 先不考虑最后一次攻击
        for (int i = 0; i < timeSeries.size() - 1; i++) {
        	// 攻击+持续时间<下一次攻击时间,则可以在持续时间内均中毒
            if (timeSeries[i] + duration - 1 < timeSeries[i + 1])
            {
                sum += duration;
            }
            // 否则,只能在两次连续攻击中间时间中毒,此时间<持续时间
            else
            {
                sum = sum + timeSeries[i + 1] - timeSeries[i];
            }
        }
        // 最后一次攻击永远可以持续中毒
        return sum + duration;
    }
};

答案

cpp 复制代码
class Solution {
public:
    int findPoisonedDuration(vector<int>& timeSeries, int duration) {
        int ans = 0;
        int expired = 0;
        for (int i = 0; i < timeSeries.size(); ++i) {
        	// 未中毒,则可以完成duration中毒
            if (timeSeries[i] >= expired) {
                ans += duration;
            } else {
            	// 正在中毒,减去上次中毒结束时间
                ans += timeSeries[i] + duration - expired;
            }
            // 未中毒起始时间
            expired = timeSeries[i] + duration;
        }
        return ans;
    }
};

414. 第三大的数

cpp 复制代码
class Solution {
public:
    int thirdMax(vector<int>& nums) {
    	// sort排序数组函数
        sort(nums.begin(), nums.end());
        // reverse反转数组函数
        reverse(nums.begin(), nums.end()); 
        // erase去重数组函数
        nums.erase(unique(nums.begin(), nums.end()), nums.end()); 
        if(nums.size()>=3){
            return nums[2];
        }
        else{
            return nums[0];
        }
    }
};

答案

cpp 复制代码
class Solution {
public:
    int thirdMax(vector<int> &nums) {
    	// greater从大到小排序
        sort(nums.begin(), nums.end(), greater<>());
        for (int i = 1, diff = 1; i < nums.size(); ++i) {
            if (nums[i] != nums[i - 1] && ++diff == 3) { // 此时 nums[i] 就是第三大的数
                return nums[i];
            }
        }
        return nums[0];
    }
};

628. 三个数的最大乘积

cpp 复制代码
class Solution {
public:
    int maximumProduct(vector<int>& nums) {
        int len = nums.size();
        // 将数组降序
        sort(nums.begin(), nums.end(), greater<>());
        // 能得到三个数乘积最大值有两种情况:
        // 1.全部为正数数组升序排列后,前三个元素乘积最大
        // 2.既含有正数也含有负数的数组,两个中最大的负数和最大的正数相乘也可能得到最大乘积
        // 3.两种情况比较得出最大值返回
        int result = nums[0] * nums[1] * nums[2];
        int result1 = nums[0] * nums[len - 1] * nums[len - 2];
        if (result < result1) {
            return result1;
        }
        else {
            return result;
        }
    }
};
相关推荐
GreenTea2 小时前
vLLM 与 SGLang KV Cache 底层实现机制深度调研报告
前端·后端·算法
Bode_20022 小时前
多资源规划(含生产调度、库存管理及产能规划)的创新优化算法
算法·调度
土司大王3 小时前
LeetCode hot100——35.搜索插入位置:Java 二分模板、左闭右开区间与插入点分析
java·算法·leetcode
微三云生态系统架构师-彭丹3 小时前
远方好物S2B2C系统架构:一级分销与保证金托管的合规技术实现
人工智能·算法
土司大王3 小时前
LeetCode hot100——34.在排序数组中查找元素的第一个和最后一个位置:Java 二分模板、边界分析
java·算法·leetcode
罗西的思考5 小时前
机器人模型(WM / WAM / VLA)综合分析与对比:从「看」到「想」再到「做」
人工智能·算法·机器学习
小哈里6 小时前
【知识】从学科到实践:自然・工程・社科・人文|算法・研发・产品・品牌设计
程序人生·算法·产品·设计·工程
小π军6 小时前
最大重叠区间数量
数据结构·算法
镜像视界(浙江)科技有限公司7 小时前
《视频孪生之上:二维展示终结,三维空间计算重构城市逻辑》——跨摄像连续表达 × 三角测量厘米级定位 × 动态轨迹建模,构建新一代城市空间
大数据·人工智能·算法·矩阵·音视频·空间计算
a187927218317 小时前
【算法】双指针与滑动窗口(二):滑动窗口——吃进、判定、吐出
算法·leetcode·双指针·滑动窗口·原理·模板·算法讲解