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 ++;
        }
    }
}

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

相关推荐
凯子坚持 c23 分钟前
深度解析算法之滑动窗口
数据结构·算法
xyliiiiiL1 小时前
二分算法到红蓝染色
java·数据结构·算法
珹洺2 小时前
C++从入门到实战(十)类和对象(最终部分)static成员,内部类,匿名对象与对象拷贝时的编译器优化详解
java·数据结构·c++·redis·后端·算法·链表
写bug的小屁孩2 小时前
移动零+复写零+快乐数+盛最多水的容器+有效三角形的个数
c++·算法·双指针
飞川撸码2 小时前
【LeetCode 热题100】208:实现 Trie (前缀树)(详细解析)(Go语言版)
算法·leetcode·golang·图搜索算法
这就是编程3 小时前
自回归模型的新浪潮?GPT-4o图像生成技术解析与未来展望
人工智能·算法·机器学习·数据挖掘·回归
羑悻的小杀马特3 小时前
【狂热算法篇】探寻图论幽径:Bellman - Ford 算法的浪漫征程(通俗易懂版)
c++·算法·图论·bellman_ford算法
Fantasydg7 小时前
DAY 31 leetcode 142--链表.环形链表
算法·leetcode·链表
basketball6167 小时前
C++ STL常用算法之常用排序算法
c++·算法·排序算法
moz与京7 小时前
[附C++,JS,Python题解] Leetcode 面试150题(10)——轮转数组
c++·python·leetcode