1. 平方数字的个数(排序数组)
问题描述
排序数组,平方后,数组当中有多少不同的数字(相同算一个)。
思路
这里是排序数组,既然有重复,肯定是有负数,0,1这些数字。平方后两头大,中间小,可以用首尾指针共同向中间扫描 ,扫描时去掉重复元素,同时用一个sum来记录有多少个不同数字。
代码
func sortSquare(nums []int) int {
var sum int
left, right := 0, len(nums) - 1
for left <= right {
if nums[left] + nums[right] == 0 { // 如果nums[left] == -nums[right]
sum++ // 左指针右移并去重
temp := nums[left] // 右指针左移并去重
// 左指针右移,去重
for left <= right && nums[left] == temp {
left++
}
// 右指针左移,去重
for left <= right && nums[right] == -temp {
right--
}
} else if nums[left] + nums[right] < 0 { // 如果nums[left]过小,左指针右移并去重
sum++
temp := nums[left]
for left <= right && nums[left] == temp {
left++
}
} else { // 如果nums[right]过大,右指针左移并去重
sum++
temp := nums[right]
for left <= right && nums[right] == temp {
right--
}
}
}
return sum
}
2. 找出数组不重复的个数
1. 问题描述
一个数据先递增再递减,找出数组不重复的个数,比如 [1, 3, 9, 1],结果为3,不能使用额外空间,复杂度o(n)
2. 思路
双指针从两头向中间逼近,扫描时去掉重复元素。
3. 代码
func findNotRepeatNums(nums []int) int {
left, right := 0, len(nums) - 1
var sum int
for left <= right {
if nums[left] == nums[right] {
sum++
temp := nums[left]
for left <= right && nums[left] == temp {
left++
}
for left <= right && nums[right] == temp {
right--
}
} else if nums[left] < nums[right] {
sum++
temp := nums[left]
for left <= right && nums[left] == temp {
left++
}
} else {
sum++
temp := nums[right]
for left <= right && nums[right] == temp {
right--
}
}
}
return sum
}
3. 两数之和II扩展(找出所有和为k的数对)
1. 问题描述
递增数组,找出所有和为k的数对
注意:该题和两数之和II leetcode167类似,只是leetcode167只需要找到一组数对即可,而该要返回所有数对
2. 思路
双指针遍历 :用头尾两个指针,分别开始遍历,两个数字和大于k时,右指针向前移动,小于k时左指针向后移动
3. 代码
func sumk(nums []int, k int) [][2]int {
left, right := 0, len(nums) - 1
var res [][2]int
for left <= right {
if nums[left] + nums[right] == k {
res = append(res,[2]int{nums[left], nums[right]} )
temp1 := nums[left]
for left <= right && nums[left] == temp1{
left++
}
temp2 := nums[right]
for left <= right && nums[right] == temp2{
right--
}
} else if nums[left] + nums[right] < k {
temp := nums[left]
for left <= right && nums[left] == temp{
left++
}
} else {
temp := nums[right]
for left <= right && nums[right] == temp{
right--
}
}
}
return res
}