LeetCode刷题——Array篇(Find All Duplicates in an Array)

本文介绍了一种在不使用额外空间的情况下找出数组中重复元素的方法。利用数组元素值的特点,通过将出现过的元素位置上的数值标记为负数来实现查找,确保了算法的空间复杂度为O(1),时间复杂度为O(n)。

Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.

Find all the elements that appear twice in this array.

Could you do it without extra space and in O(n) runtime?

这个题目的要求是,只读,并且不准申请额外空间,那么如何标记成了一个重要的问题,恰好题目中最多只会出现两次,因此找到元素后,利用负号进行标记是个最佳的方式,代码如下

class Solution {
public:
    vector<int> findDuplicates(vector<int>& nums) {
        int i = 0;
        int pos = 0;
        vector<int> final_num;
        for (; i < nums.size(); i++)
        {
            pos = abs(nums[i]) - 1;
            if (nums[pos] < 0)
            {
                final_num.push_back(abs(nums[i]));
            }
            else
            {
                nums[pos] = -nums[pos];
            }

        }
        return final_num;
    }
};
根据已有信息和相关经验,以下是针对 LeetCode 热门 100 的推荐顺序。该顺序结合了目类型、难度以及高频面试的特点,旨在帮助用户逐步掌握核心算法思想,并提升解能力。 ### 顺序安排 #### 一、基础数据结构类 这些目主要围绕数组、字符串、链表等基本数据结构展开,适合入门阶段练习,帮助熟悉编程语言和基础逻辑。 - **两数之和**(Two Sum)[^2] - **最长公共前缀**(Longest Common Prefix) - **有效的括号**(Valid Parentheses) - **合并两个有序链表**(Merge Two Sorted Lists) - **删除排序数组中的重复项**(Remove Duplicates from Sorted Array) #### 二、双指针与滑动窗口 这一类目常用于处理子数组或子字符串问,涉及固定或可变长度的窗口操作。 - **最长连续递增序列**(Find the Longest Substring with At Most K Distinct Characters) - **最小覆盖子串**(Minimum Window Substring)[^3] - **盛最多水的容器**(Container With Most Water) #### 三、二分查找 二分查找是高效搜索算法的基础,适用于已排序数组中查找特定值或边界条件。 - **搜索插入位置**(Search Insert Position) - **在排序数组中查找元素的第一个和最后一个位置**(Find First and Last Position of Element in Sorted Array)[^2] - **搜索旋转排序数组**(Search in Rotated Sorted Array) #### 四、动态规划 动态规划是解决最优化问的核心方法之一,建议从简单状态转移开始理解。 - **爬楼梯**(Climbing Stairs) - **最大子序和**(Maximum Subarray) - **不同路径**(Unique Paths) - **编辑距离**(Edit Distance) #### 五、树与图遍历 这部分内容涵盖深度优先搜索(DFS)、广度优先搜索(BFS)以及二叉树的基本操作。 - **二叉树的最大深度**(Maximum Depth of Binary Tree) - **对称二叉树**(Symmetric Tree) - **路径总和**(Path Sum) - **岛屿数量**(Number of Islands)[^2] #### 六、回溯与贪心算法 回溯法用于解决组合、排列、子集等问,而贪心算法适用于局部最优解能导出全局最优解的问。 - **组合总和**(Combination Sum) - **全排列**(Permutations) - **跳跃游戏**(Jump Game) - **买卖股票的最佳时机 II**(Best Time to Buy and Sell Stock II) #### 七、高级技巧与复杂型 这部分目难度较高,通常出现在进阶面试中,建议在掌握基础后挑战。 - **接雨水**(Trapping Rain Water) - **正则表达式匹配**(Regular Expression Matching) - **最长有效括号**(Longest Valid Parentheses) --- ### 示例代码:滑动窗口模板 ```java int start = 0, end = 0, sum = 0, res = Integer.MAX_VALUE; while (end < n) { sum += nums[end++]; while (sum >= target) { res = Math.min(res, end - start); sum -= nums[start++]; } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值