leetcode算法入门系列学习二『双指针』

有序数组的平方

题目描述:

传送门

解题思路:

因为是排序的整数数组,可以循环每个元素并做平方运算,得到原数组排序的新数组,再对新数组进行非递减顺序排序即可

解题方法

  • PHP版
class Solution {
	/**
     * @param Integer[] $nums
     * @return Integer[]
     */
    function sortedSquares($nums) {
        $arr = [];
        foreach($nums as $v) {
            $arr[] = pow($v, 2);
        }
        sort($arr);
        return $arr;
    }
}

在这里插入图片描述

  • GO版
func sortedSquares(nums []int) []int {
    var tmps = []int{}
	for _, v := range nums {
		var temp = v * v
		tmps = append(tmps, temp)
	}
	sort.Ints(tmps)
	return tmps
}

// 双指针解法
func sortedSquares(nums []int) []int {
   n := len(nums)
	ans := make([]int, n)
	i, j := 0, n-1
	for pos := n-1; pos >=0; pos--{
		v,w := nums[i]*nums[i], nums[j]*nums[j]
		if v > w {
			ans[pos] = v
			i++
		} else {
			ans[pos] = w
			j--
		}
	}
	return ans
}

在这里插入图片描述在这里插入图片描述

旋转数组

题目描述 :

传送门

解题思路

经观察可以发现,数组旋转n次后,位置变化为 索引值(i)加上旋转量(k)后对其长度(n)取余后的值即为该值在新数组中的索引位置:(i+k)%n

解题方法

PHP

function rotate(&$nums, $k) {
        $len = count($nums);
        for($i=0;$i<$len;$i++){
            $news[($i+$k) % $len] = $nums[$i];
        }
        ksort($news);
        // 后面这两步我也没搞懂为什么要这么做
        // 因为在测试过程中,截止到上面直接返回时没有任何问题的,但是
        // 在leetcode中测试就是无法通过
        // 如果有清楚具体原因的,可以告知在下,谢谢哪位大神了!!!
        $nums = $news;
        return $nums;
    }

在这里插入图片描述
GO

// 传统方法,循环逐次移动,现将最后一位替换到第一位,然后将剩余位的其它值逐次后移,共循环k次
// 这种方法理论上是没有问题,leetcode测试用例也全部通过,但是提交时会超出时间限制
func rotate(nums []int, k int) []int  {
    len := len(nums)
    for k>0{
        tmp := nums[len-1]
        for i := len-1;i>0;i--{
            nums[i] = nums[i-1]
        }
        nums[0] = tmp
        k--
    }
    return nums
}
// 方法二(同上述PHP版思路)
func rotate(nums []int, k int) []int  {
    new := make([]int, len(nums))
    for i,v := range nums {
        new[(i+k) % len(nums)] = v
    }
    copy(nums, new)
    return nums
}
// 方法三,多次翻转
func rotate(nums []int, k int) []int {
    len := len(nums)
    k %= len
    reverse(nums, 0, len-1)
    reverse(nums, 0, k-1)
    reverse(nums,k, len-1)
    return nums
}

func reverse(nums[]int, s int, e int)[]int{
    for s <e {
        nums[s], nums[e] = nums[e], nums[s]
        s++
        e--
    }
    return nums
}

在这里插入图片描述
在这里插入图片描述

特别说明:此次算法本应以双指针为核心,但是无奈本人关于这块知识实在是能力有限,只能尝试其它解决办法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bennett_G

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值