我会把一些感触比较深的算法题记录在自己的博客上,基本会用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]用代码一步一步走一遍。更优解是隔着一个数字进行比较。