记录刷leedcode的第一天(一天2-3题)

知识点:

数组是什么?
数组是最简单的数据结构之一。数组,即元素的序列,可以按特定顺序存储元素。元素可以是整数,浮点数,字符,各种结构体等等。在C与C++语言中,一个长度为n的数组a,它的下标从0开始到n-1结束,可以定义为:
int a[n];
在C++中,我们也可以用vector代替数组。
vector a;
用上述代码定义的数组长度为0。若我们要定义一个长度为n的数组,可以用下面的代码:
vector a(n);
若我们要定义一个长度为n的浮点数组b,并将所有元素初始化为1.0,那么可以用下面的代码:
vector b(n, 1.0);
数组的遍历
如何遍历一个数组?
我们可以用以下代码段遍历数组a:
for (int i = 0; i < a.size(); i++) {
    //对辅助变量、a[i]或a[i+k]进行操作(k可以是任何需要的整数值)
}
如何在遍历数组时记录数组中的最大(小)值?
我们可以用辅助变量max_num记录数组中的最大值,在遍历数组时,用max_num和数组的每一个元素比较,如更大则更新,也可参考如下代码:
int max_num = a[0];
for (int i = 1; i < a.size(); i++) {
    max_num = max(a[i], max_num)
}

出处:

[力扣刷题攻略] Re:从零开始的力扣刷题生活 (2023-4-12 更新) - 力扣(LeetCode)https://leetcode.cn/circle/discuss/E3yavq/#%E6%95%B0%E7%BB%84%E7%AF%87

vector详细介绍C++ vector 容器浅析 | 菜鸟教程 (runoob.com)https://www.runoob.com/w3cnote/cpp-vector-container-analysis.html

题目1: 

给定一个二进制数组 nums , 计算其中最大连续 1 的个数。

示例 1:

输入:nums = [1,1,0,1,1,1]
输出:3
解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.
示例 2:

输入:nums = [1,0,1,1,0,1]
输出:2

提示:

1 <= nums.length <= 105
nums[i] 不是 0 就是 1.

题目出处:

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/max-consecutive-ones
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的解题:

class Solution {

public:

    int findMaxConsecutiveOnes(vector& nums) {

    int num[100000]={0};//初始化一个数组并赋值为0

    int j=0;//用来记录一下第几个连续1

    int i;

   for(i=0;i

     if(nums[i]==1)

      num[j]++;//若为1则加上1

      else

      j++;//否则记录下一个连续1

   }    

   int maxnum=num[0];//连续1的最大值

   for(i=1;i<=j;i++)//用一个for循环进行遍历

   {

    if(num[i]>maxnum)

    maxnum=num[i];

   }

  // cout<

   return maxnum;//这里需要返回值才能输出答案

   }

};

得到的结果:

执行结果:

通过

显示详情

查看示例代码

添加备注

执行用时:32 ms, 在所有 C++ 提交中击败了61.39%的用户

内存消耗:35.7 MB, 在所有 C++ 提交中击败了5.06%的用户

通过测试用例:42 / 42

分析:

代码太过于繁琐可以进一步简化使用库函数

官方答案:

class Solution {
public:
    int findMaxConsecutiveOnes(vector& nums) {
        int maxCount = 0, count = 0;
        int n = nums.size();
        for (int i = 0; i < n; i++) {
            if (nums[i] == 1) {
                count++;
            } else {
                maxCount = max(maxCount, count);//这里是直接进行比较取两者最大值
                count = 0;
            }
        }
        maxCount = max(maxCount, count);//当最后几位是连续的1时这里需要再进行一次比较
        return maxCount;
    }
};

题目2:

给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。

示例 1:

输入:[3, 2, 1]
输出:1
解释:第三大的数是 1 。
示例 2:

输入:[1, 2]
输出:2
解释:第三大的数不存在, 所以返回最大的数 2 。
示例 3:

输入:[2, 2, 3, 1]
输出:1
解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。
此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。
 

提示:

1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1

出处:

414. 第三大的数 - 力扣(LeetCode)icon-default.png?t=N3I4https://leetcode.cn/problems/third-maximum-number/

我的题解:

class Solution {

public:

    int thirdMax(vector& nums) {

     int n=nums.size();//用来判断小于3的情况可以直接出答案

    vectora;//用来消除重用

     sort(nums.begin(),nums.end());//排序从小到大

     if(n<3)//n小于3直接出答案

     return nums[n-1];//由于是重小到大排序所以得到第大值是最后一个

     else{

         a.push_back(nums[0]);//现将第一个元素放到临时数组中

     for(int i=1;i

     {

         if(nums[i]!=nums[i-1]){//除重

             a.push_back(nums[i]);

         }

     }

     for(int j=0;j

     nums[j]=a[j];//由于题目需求所以需要将除重后的结果放到nums中

     int m=a.size();//这里一定是a.size()

     if(m<3)//当除重后的结果小于3时输出最大值

     return nums[m-1];

     else

     return nums[m-3];

     }

    }

};

结果:

执行结果:

通过

显示详情

查看示例代码

添加备注

执行用时:4 ms, 在所有 C++ 提交中击败了91.12%的用户

内存消耗:9.1 MB, 在所有 C++ 提交中击败了31.65%的用户

通过测试用例:34 / 34

官方答案:

class Solution {
public:
    int thirdMax(vector &nums) {
        sort(nums.begin(), nums.end(), greater<>());//这里greater是c++给的内置函数从大到小排序

        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];//如果没有第三大的值就输出最大值
    }
};

积累:

(16条消息) c++中的sort 排序函数 less和greater使用_greater函数c++_红鲤鱼与绿鲤鱼与驴__的博客-CSDN博客icon-default.png?t=N3I4https://blog.csdn.net/zy13270867781/article/details/74923931

你可能感兴趣的:(刷leedcode之路,c++,算法,数据结构,leetcode)