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;
        }
    }
};
相关推荐
董董灿是个攻城狮4 小时前
5分钟搞懂什么是窗口注意力?
算法
Dann Hiroaki4 小时前
笔记分享: 哈尔滨工业大学CS31002编译原理——02. 语法分析
笔记·算法
qqxhb6 小时前
零基础数据结构与算法——第四章:基础算法-排序(上)
java·数据结构·算法·冒泡·插入·选择
FirstFrost --sy8 小时前
数据结构之二叉树
c语言·数据结构·c++·算法·链表·深度优先·广度优先
森焱森8 小时前
垂起固定翼无人机介绍
c语言·单片机·算法·架构·无人机
搂鱼1145148 小时前
(倍增)洛谷 P1613 跑路/P4155 国旗计划
算法
Yingye Zhu(HPXXZYY)8 小时前
Codeforces 2021 C Those Who Are With Us
数据结构·c++·算法
独行soc8 小时前
2025年渗透测试面试题总结-2025年HW(护网面试) 33(题目+回答)
linux·科技·安全·网络安全·面试·职场和发展·护网
无聊的小坏坏9 小时前
三种方法详解最长回文子串问题
c++·算法·回文串
长路 ㅤ   10 小时前
Java后端技术博客汇总文档
分布式·算法·技术分享·编程学习·java后端