LeetCode_26. 从排序数组中删除重复项

本文介绍了一种高效的方法来删除排序数组中的重复元素,并确保每个元素只出现一次。使用了C++实现,通过一次遍历和O(1)额外空间达到目标。此算法将有效元素向前移动并更新数组长度。

26从排序数组中删除重复项

题目:

给定一个有序数组,你需要原地删除其中的重复内容,使每个元素只出现一次,并返回新的长度。

不要另外定义一个数组,您必须通过用 O(1) 额外内存原地修改输入的数组来做到这一点。

示例:

给定数组: nums = [1,1,2],

你的函数应该返回新长度 2, 并且原数组nums的前两个元素必须是1和2
不需要理会新的数组长度后面的元素

 


答案:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if(nums.size()==0)return 0;
        int i,pos=0;
        for(i=1;i<nums.size();i++)
            if(nums[i]-nums[pos])
                nums[++pos]=nums[i];
        return pos+1;
    }
};


思路:只需要一次遍历,pos表示已处理好的数组长度,遍历的过程中跳过重复的值,每遇到一个有效的值就把它赋给前面正确的位置:++pos
基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
LeetCode26题“删除排序数组中的重复项”有以下几种解法: #### 解法一:使用额外数组 ```java public class Solution { public int removeDuplicates(int[] nums) { // 如果数组 nums[] 的长度为 0,则数组不包含任何元素,因此返回 0 if(nums==null||nums.length==0){ return 0; } // 定义存放非重复项数组 int b[] = new int[nums.length]; b[0] = nums[0]; // 因为b[0] 已经确定,所以 数量k初始值为1,index下标 初始值也为1 int k = 1; int index = 1; for(int i = 1; i < nums.length; i++){ // 如果一个数和它前一个不相等,就认为是非重复项 if(nums[i] != nums[i - 1]){ // 将非重复项赋值给b[] b[index] = nums[i]; k++; // 数量加一 index++; // 下标加一 } } // b.length==k,将b数组重新赋值给nums的前k个元素 for(int i = 0; i < k; i++){ nums[i] = b[i]; } return k; } } ``` 此解法先判断数组是否为空或长度为0,若为真则返回0。接着创建一个新数组来存放非重复元素,遍历原数组,将非重复元素存入新数组,并记录非重复元素的数量和下标。最后将新数组的前k个元素复制回原数组,并返回k [^1]。 #### 解法二:快慢指针 ```java class Solution { public int removeDuplicates(int[] nums) { int i = 0; for(int j = i + 1; j < nums.length; ++j){ // 找到了不与nums[i]的重复的值,则将不重复的值赋值放在i的后面一位,同时i的下标后移一位,开始下一个数的重复判断。 if(nums[j] != nums[i]){ nums[++i] = nums[j]; } } return i + 1; } } ``` 该解法利用快慢指针,慢指针`i`用于记录非重复元素的位置,快指针`j`用于遍历数组。当`nums[j]`与`nums[i]`不相等时,将`nums[j]`赋值给`nums[++i]`,最后返回`i + 1` [^2]。 #### 解法三:另一种快慢指针写法 ```java class Solution { public int removeDuplicates(int[] nums) { if (nums == null || nums.length == 0) return 0; int p = 0, q = 1; while (q < nums.length) { if (nums[p] != nums[q]) { nums[p + 1] = nums[q]; p++; } q++; } return p + 1; } } ``` 此解法同样使用快慢指针,`p`指针指向当前的非重复元素位置,`q`指针用于遍历数组。当`nums[p]`与`nums[q]`不相等时,将`nums[q]`赋值给`nums[p + 1]`,并将`p`指针后移一位,最后返回`p + 1` [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值