zoukankan      html  css  js  c++  java
  • Leetcode刷题记(8)——删除排序数组中的重复项

    搬运工~

    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

    不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

    示例 1:

    给定数组 nums = [1,1,2], 
    
    函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 
    
    你不需要考虑数组中超出新长度后面的元素。
    解题思路:题目中一再强调在原地删除,也就是说不希望使用新的内存空间,在原数组上进行操作,很自然就要想到“引用”,因为引用不会对原数组进行拷贝,
    而是直接在原来的元素上进行操作,只是原来元素的一个别名,显然leetcode题目代码中也是使用的引用。
         接下来我的脑回路想的是:嵌套循环,如果元素与后一个元素或前一个元素值相等,就使用循环把这个值往后移,这样把相等的元素移到了后面,前面的元素都是不相等的;
    这样一波操作下来彻底乱了,最后返回时就编译错误,又偷偷的去看了别人的解答:
         使用两个“指针!!!”一个快指针,一个慢指针,慢指针就相当于指向不重复的元素,快指针就遍历数组:
    当快指针不等于慢指针指向的元素时,慢指针向前进,并将快指针的元素赋给慢指针指向的下标元素处,
    最后返回慢指针+1即可。注意!!!先判断数组是否为空,否则会报超时错误“runtime error: reference binding to null pointer of type 'const value_type' (stl_vector.h)”
    在这个方法里使用的是引用,是在调用函数传来的形参上直接进行操作,因此虽然该函数返回的是一个整数值,但是对于调用函数来说返回的是没有重复项的数组!!!
    但是!!!这个方法的前提是数组中的元素已经排好序,万一是没排好序的应该先进行排序,这里又要恶补各种排序大法了!!!
    知识点:引用;排序;
  • 相关阅读:
    SD卡的控制方法(指令集和控制时序)
    MDK的优化应用(转)
    SD卡的SPI模式的初始化顺序(转)
    SD卡读写扇区注意事项(转)
    MDK下调试时提示AXF文件无法导入的解决方法(转)
    把一个 int 数字 n 格式化成16进制的字符串(前面补零成0位)
    DB9 公头母头引脚定义及连接、封装
    RS232 DB9 公头 母头 串口引脚定义
    Codeforces 91C Ski Base 加边求欧拉回路数量
    Cocos Code IDE + Lua初次使用FastTiledMap的坑
  • 原文地址:https://www.cnblogs.com/wangjm63/p/10849177.html
Copyright © 2011-2022 走看看