LeetCode(80)

我会把一些感触比较深的算法题记录在自己的博客上,基本会用kotlin来写。这次我分析的是leetcode第80题,首先这是我的解法:

//有两个循环效率一定不是最优解所需要的
class Solution {
    fun removeDuplicates(nums: IntArray): Int {
        if (nums.size <= 2) {
            return nums.size
        }
        var total = 0
        var i = 0
        while (i < nums.size - 2 - total) {
            if (nums[i] == nums[i + 1] && nums[i + 1] == nums[i + 2]) {
                total++
                for (j in i + 2 until nums.size - total) {
                    nums[j] = nums[j + 1]
                }
                i--
            }
            i++
        }
        return nums.size - total
    }
}

这是另一种效率更高的解法:

//尽量不要两个循环同时嵌套
class Solution {
    fun removeDuplicates(nums: IntArray): Int {
        if (nums.size <= 2) return nums.size
        var end = 2 // [0, end) is the result string, excluding nums[end], so end is the final length
        for (i in 2 until nums.size) {//如果循环中不要最后一个范围区间的值可以使用 until 函数:[2, nums.size)
            if (nums[end - 2] != nums[i]) { // 只需要对比这两个数是否相等即可
                nums[end++] = nums[i]
            }
        }
        return end
    }
}

这是这道题的讲解:要把题目中的那个例子[1,1,1,2,2,3]用代码一步一步走一遍。更优解是隔着一个数字进行比较。

https://www.cnblogs.com/grandyang/p/4329295.html

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值