2024/9/22 leetcode 128题 283题

目录

128.最长连续序列

题目描述

题目链接

解题思路与代码

题目2

题目描述

题目链接

解题思路与代码

=====================================

128.最长连续序列

题目描述

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n)的算法解决此问题。

示例 1:

复制代码
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

示例 2:

复制代码
输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109

题目链接

128.最长连续序列

解题思路与代码

本题目就是先使用一个set数组遍历原数组,去重,然后正式开始我们的逻辑。

就拿样例2来举例

longestidx就是最终结果,每次遍历nums,然后如果该数的前一位不存在,说明可以从这个数开始统计连续区间,currentnum就是统计每一段区间长度,与最终结果取最大值,从而使得结果最大。

(c++代码)

cpp 复制代码
class Solution {
public:
    int longestConsecutive(vector<int>& nums) {

        unordered_set<int> num_set;
        for(auto num : nums) {
            num_set.insert(num);
        }
        int longestidx = 0;
        for(auto num : nums) {
            if(!num_set.count(num - 1)) {
                int currentnum = num;
                int currentidx = 1;

                while(num_set.count(currentnum + 1)) {
                    currentnum ++;
                    currentidx ++;
                }
                longestidx = max(longestidx, currentidx);
            }
        }
        return longestidx;
    }

};

(java代码)

java 复制代码
class Solution {
    public int longestConsecutive(int[] nums) {
        Set<Integer> num_set = new HashSet<Integer>();
        for(int num : nums) {
            num_set.add(num);
        }
        int longestStreak = 0;

        for(int num : nums) {
            if(!num_set.contains(num - 1)) {
                int currentNum = num;
                int currentStreak = 1;

                while(num_set.contains(currentNum + 1)) {
                    currentNum += 1;
                    currentStreak += 1;
                }

                longestStreak = Math.max(longestStreak, currentStreak);
            }
        }
        return longestStreak;
    }
}

题目2

题目描述

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

提示:

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

**进阶:**你能尽量减少完成的操作次数吗?

题目链接

283.移动零

解题思路与代码

本题题目就是双指针,我们直接看图,就用第一个样例模拟。

第一次循环

第二次循环

第三次循环

第四次循环

第五次循环

此时我们已经将非零数字都弄到前面了,剩下部分全部填0,用slow扫尾。

(c++代码)

cpp 复制代码
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        if(nums.size()<2) return;
        int slow = 0,fast = 0;
        for(;fast<nums.size();fast++){
            if(nums[fast]!=0){
                nums[slow] = nums[fast];
                slow ++;
            }
        }
        for(;slow<nums.size();slow++){
            nums[slow]=0;
        }
    }
};

(java代码)

java 复制代码
class Solution {
    public void moveZeroes(int[] nums) {
        int fast = 0, slow = 0;
        for(; fast < nums.length; fast ++ ) {
            if(nums[fast] != 0) {
                nums[slow] = nums[fast];
                slow ++;
            }
        } 
        while(slow < nums.length) {
            nums[slow ] = 0;
            slow ++;
        }
    }
}

=========================================================================

相关推荐
浮生如梦_2 小时前
Halcon基于laws纹理特征的SVM分类
图像处理·人工智能·算法·支持向量机·计算机视觉·分类·视觉检测
励志成为嵌入式工程师4 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
师太,答应老衲吧4 小时前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
捕鲸叉4 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer4 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
wheeldown5 小时前
【数据结构】选择排序
数据结构·算法·排序算法
观音山保我别报错6 小时前
C语言扫雷小游戏
c语言·开发语言·算法
TangKenny7 小时前
计算网络信号
java·算法·华为
景鹤7 小时前
【算法】递归+深搜:814.二叉树剪枝
算法
iiFrankie7 小时前
SCNU习题 总结与复习
算法