LeetCode-题目整理【1】

从下面的三道题可以发现,都属于**删除元素,最后返回有效数组的长度。那么这时候可以使用双指针**, p为初始化一个指针,指向数组 nums 的起始位置,然后遍历数组,根据题目找到满足的条件,这时候就将当前遍历的值赋值给nums[p],然后p++(前后顺序需要根据题目来解答),所以大概代码种会存在:

p := 0  //初始化
...... 
nums[p] = nums[i]
p++

(或者:
p++
nums[p] = nums[i]
  1. 移除元素
    给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
    不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
    元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1: 输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2] 解释:函数应该返回新的长度 2,
并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums =
[2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。 示例 2: 输入:nums =
[0,1,2,2,3,0,4,2], val = 2 输出:5, nums = [0,1,3,0,4] 解释:函数应该返回新的长度 5,并且
nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

func removeElement(nums []int, val int) int {
    p := 0
    for i := 0; i < len(nums); i++ {
        if nums[i] != val {
            nums[p] = nums[i]
            p++
        }
    }
    return p
}

// 具体步骤如下:

// 初始化一个指针 p,指向数组 nums 的起始位置。
// 遍历数组 nums,将不等于 val 的元素放入数组的起始位置,同时将 p 向后移动一位。
// 返回 p 的值,即为移除后数组的新长度。
  1. 删除有序数组中的重复项
    给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
    考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
    更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
    返回 k 。
    示例 1:
    输入:nums = [1,1,2]
    输出:2, nums = [1,2,_]
    解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
    示例 2:
    输入:nums = [0,0,1,1,1,2,2,3,3,4]
    输出:5, nums = [0,1,2,3,4]
    解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
func removeDuplicates(nums []int) int {
	if len(nums) == 0 {
		return 0
	}
	p := 0
	for i := 1; i < len(nums); i++ {
		if nums[p] != nums[i] {
			p++
			nums[p] = nums[i]
		}
	}
	return p + 1
}

  1. 删除有序数组中的重复项 II
    给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
    不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
    示例 1:
    输入:nums = [1,1,1,2,2,3]
    输出:5, nums = [1,1,2,2,3]
    解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3。 不需要考虑数组中超出新长度后面的元素。
    示例 2:
    输入:nums = [0,0,1,1,1,1,2,3,3]
    输出:7, nums = [0,0,1,1,2,3,3]
    解释:函数应返回新长度 length = 7, 并且原数组的前七个元素被修改为 0, 0, 1, 1, 2, 3, 3。不需要考虑数组中超出新长度后面的元素。
func removeDuplicates(nums []int) int {
    if len(nums) <= 2 {
        return len(nums)
    }
    
    count := 1
    p := 0
    
    for i := 1; i < len(nums); i++ {
        if nums[i] == nums[i-1] {
            count++
        } else {
            count = 1
        }
        
        if count <= 2 {
            p++
            nums[p] = nums[i]
            
        }
    }
    
    return p+1
}

你可能感兴趣的:(leetcode,算法,数据结构)