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
}

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

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

猜你喜欢

转载自blog.csdn.net/glx490676405/article/details/120708074