有序数组的平方 leetcode977
个人的初次尝试
已经想到双指针法,但是对于循环的边界条件仍然找不明白,对于特殊情况没有适应性,很容易出错
而且在更改的过程中喜欢钻牛角尖,不更改现有的惯性思维,后续需要更正这些缺点。
双指针法
- 中心法
先找中心位置,从中心开始双指针 从小到大
// 中心位置法,先找到正负交界处的值
func sortedSquares(nums []int) []int {
//找交界,我们这里找最小的正数
var i int //最小正数的序列
L := len(nums) //定义nums数组的长度
result := make([]int, L) //新建结果数组
for i = 0; nums[i] <= 0; {
i++
if i == L {
break
}
}
// fmt.Println(nums[i])
//从中心向两边
// 1.左边到边界
// 2.右边到边界
n := 0 //result的序列
var nag, pos = i - 1, i //定义正负两边的指针
for nag != -1 || pos != L { //循环到边界值,两个都到边界值说明所有值都填完
if nag == -1 { //非正填完,直接填正即可
result[n] = nums[pos] * nums[pos]
pos++
n++
continue
}
if pos == L { //正填完,直接填非正即可
result[n] = nums[nag] * nums[nag]
nag--
n++
continue
}
if -nums[nag] < nums[pos] { //非正部分小于正,填非正,nag-1
result[n] = nums[nag] * nums[nag]
nag--
} else { //非正部分大于等于正,填正,pos+1
result[n] = nums[pos] * nums[pos]
pos++
}
n++
}
return result
}
这里仍旧有瑕疵,比如我们这里在寻找最小正数时,可以将判断n是否等于L加入到判断条件中,而不使用break。后面的填入数字过程中也可以使用多个if else进行判断,不使用continue
2. 两侧双指针
// 两侧双指针法
func sortedSquares(nums []int) []int {
//由于给定的数组是非递减排序,所以两侧的数平方是最大的,我们从两侧中间寻找最大值反向填充结果数组
L := len(nums)
left, right := 0, L-1 //定义左右两侧的指针
result := make([]int, L)
index := L - 1 //结果切边填入序列
for left != right { //当左右指针重合时,说明所有数据已经填充完毕
leftVal := nums[left] * nums[left]
rightVal := nums[right] * nums[right]
if leftVal >= rightVal { //左边值大,填入左边值
result[index] = leftVal
left++
} else {
result[index] = rightVal
right--
}
index--
}
result[0] = nums[left] * nums[right]
return result
}