📑 题目:26. 删除有序数组中的重复项

🚀 本题 LeetCode 传送门

题目大意

给定一个有序数组 nums,对数组中的元素进行去重,使得原数组中的每个元素只有一个。最后返回去重以后数组的长度值。

解题思路

这道题和第 27 题很像。这道题和第 283 题,第 27 题基本一致,283 题是删除 0,27 题是删除指定元素,这一题是删除重复元素,实质是一样的。

这里数组的删除并不是真的删除,只是将删除的元素移动到数组后面的空间内,然后返回数组实际剩余的元素个数,OJ 最终判断题目的时候会读取数组剩余个数的元素进行输出。

代码

  1. package leetcode
  2. // 解法一
  3. func removeDuplicates(nums []int) int {
  4. if len(nums) == 0 {
  5. return 0
  6. }
  7. last, finder := 0, 0
  8. for last < len(nums)-1 {
  9. for nums[finder] == nums[last] {
  10. finder++
  11. if finder == len(nums) {
  12. return last + 1
  13. }
  14. }
  15. nums[last+1] = nums[finder]
  16. last++
  17. }
  18. return last + 1
  19. }
  20. // 解法二
  21. func removeDuplicates1(nums []int) int {
  22. if len(nums) == 0 {
  23. return 0
  24. }
  25. length := len(nums)
  26. lastNum := nums[length-1]
  27. i := 0
  28. for i = 0; i < length-1; i++ {
  29. if nums[i] == lastNum {
  30. break
  31. }
  32. if nums[i+1] == nums[i] {
  33. removeElement1(nums, i+1, nums[i])
  34. // fmt.Printf(""此时 num = %v length = %v
  35. "", nums, length)
  36. }
  37. }
  38. return i + 1
  39. }
  40. func removeElement1(nums []int, start, val int) int {
  41. if len(nums) == 0 {
  42. return 0
  43. }
  44. j := start
  45. for i := start; i < len(nums); i++ {
  46. if nums[i] != val {
  47. if i != j {
  48. nums[i], nums[j] = nums[j], nums[i]
  49. j++
  50. } else {
  51. j++
  52. }
  53. }
  54. }
  55. return j
  56. }