Golang leetcode977 有序数组的平方 双指针法

有序数组的平方 leetcode977

leetcode977

个人的初次尝试

已经想到双指针法,但是对于循环的边界条件仍然找不明白,对于特殊情况没有适应性,很容易出错
而且在更改的过程中喜欢钻牛角尖,不更改现有的惯性思维,后续需要更正这些缺点。

双指针法

  1. 中心法
    先找中心位置,从中心开始双指针 从小到大

// 中心位置法,先找到正负交界处的值
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
}
  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值