代码随想录算法训练营第二天 | 977 有序数组的平方、209长度最小的子数组

977 有序数组的平方

就是一个非递减的数据,每个元素平方后,依然是非递减的输出

  • 第一想法:  先把每个元素平方,再排序
  • 第二想法:双指针?
func sortedSquares(nums []int) []int {
    for i := 0; i < len(nums); i++{
        nums[i] = nums[i]*nums[i]
    }
    left := 0
    right := len(nums)-1
    ans := make([]int, len(nums))
    k := len(nums)-1
    for right >= left {
        if nums[right] > nums[left]{
            ans[k] =  nums[right] 
            right --
        }else{
            ans[k] = nums[left]
            left ++
        }
        k--
       
    }
    return ans

}
  • 看来解析之后:双指针+开辟额外的空间保存数组
  • 今日收获:双指针+开辟额外空间+值从两端到里面是逐渐减小的,所以指针要从两端往里移动 用时20min

209 长度最小的子数组

返回一个数组中,符合要求的最小长度的子数组,返回子数组的长度

  • 第一想法:两个指针,但是想不到滑动窗口
func minSubArrayLen(target int, nums []int) int {
    left := 0
    sum := 0
    ans := len(nums)+1
    for i := 0; i < len(nums); i++{
        sum  += nums[i]
        for sum >= target{
            tmp := i - left +1
            if  tmp < ans{
                ans = tmp
            }
            sum -= nums[left]
            left ++

        }
    }
    if ans == len(nums)+1{
        return 0
    }else{
        return ans
    }

}
  • 看了答案之后:滑动窗口 这个窗口如何设置? for 循环作为窗口的右边,窗口往右扩大需要 sum+,窗口往左缩小时,需要减去左边的值,并且left++;最大的子串是 数组的长度,令原始的答案为 长度+1,最坏的情况就是最大的子串,让子串< 子串+1,就可以设置答案了
  • 心得:滑动窗口如何写?一开始的result = 数组长度+1 ,这样可以获得最长的子串。用时30

59 螺旋矩阵

给你一个正整数 n ,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 

  • 第一想法:没什么思路,看了一下别人的说是寻找不变量。。。。
  • 模拟顺时针画矩阵的过程: 从左到右、从上到下、从右到左、从下到上,转几圈?

先确定 转几圈,当n为偶数时,最后一个值单拿出来赋值,不算最后一圈;然后模拟每一圈,上下左右四次赋值时,的情况,根据情况编写代码。

func generateMatrix(n int) [][]int {
    // 初始化一个二维数组
    ans := make([][]int,n)
    for i:=0; i<n;i++{
        ans[i] = make([]int,n)
    }
    startIndex := 0
    lens := n-1
    loop := n/2
    if n%2 != 0{
        tmp := n/2
        ans[tmp][tmp] = n*n
    }
    value :=1 
	j := 0
	i := 0
	j1 := 0
	i1:=0
    for loop >0{
		
        for j = startIndex; j < startIndex+lens; j++{
			
            ans[startIndex][j] = value
			fmt.Printf("ans[%d][%d] = %d\n",startIndex,j,ans[startIndex][j])
            value++
			
        }
		
		for i = startIndex; i < startIndex+lens;i++{
            ans[i][j] = value
			fmt.Printf("ans[%d][%d] = %d\n",i,j, ans[i][j])
            value++
        }
        for j1 = j; j1 > j - lens;j1--{
            ans[i][j1] = value
			fmt.Printf("ans[%d][%d] = %d\n",i,j1,ans[i][j1])
            value++
        }
        for i1 = i; i1 > i -lens; i1 -- {
            ans[i1][j1] = value
			fmt.Printf("ans[%d][%d] = %d\n",i1,j1,ans[i1][j1])
            value ++
        }
        startIndex ++
        lens -= 2
        loop --
    }
	
    return ans
}

今日收获:先画出来,写出来 再用代码实现;二维数组的创建;for循环中的变量,只存在循环中,如果循环体外也想访问变量,需要在外面声明变量。

数组总结:

1. 二维数组的创建

2.一维数组的创建

3.二分查找法(有顺序的数组中)

4. 双指针法(有序数组的平方,平方后的数组由两端向中间逐渐减小,使用双指针交换两端的值使其变得有序)

5. 滑动窗口(最小子串,滑动窗口和双指针不同的是:符合条件地情况下,窗口的一边值可能不变,只滑动另一边的指针,寻找符合要求的答案)

6.  

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第二十二天的算法训练营主要涵盖了Leetcode题目中的三道题目,分别是Leetcode 28 "Find the Index of the First Occurrence in a String",Leetcode 977 "有序数组平方",和Leetcode 209 "长度最小数组"。 首先是Leetcode 28题,题目要求在给定的字符串中找到第一个出现的字符的索引。思路是使用双指针来遍历字符串,一个指向字符串的开头,另一个指向字符串的结尾。通过比较两个指针所指向的字符是否相等来判断是否找到了第一个出现的字符。具体实现的代码如下: ```python def findIndex(self, s: str) -> int: left = 0 right = len(s) - 1 while left <= right: if s[left == s[right]: return left left += 1 right -= 1 return -1 ``` 接下来是Leetcode 977题,题目要求对给定的有序数组中的元素进行平方,并按照非递减的顺序返回结果。这里由于数组已经是有序的,所以可以使用双指针的方法来解决问题。一个指针指向数组的开头,另一个指针指向数组的末尾。通过比较两个指针所指向的元素的绝对值的大小来确定哪个元素的平方应该放在结果数组的末尾。具体实现的代码如下: ```python def sortedSquares(self, nums: List[int]) -> List[int]: left = 0 right = len(nums) - 1 ans = [] while left <= right: if abs(nums[left]) >= abs(nums[right]): ans.append(nums[left ** 2) left += 1 else: ans.append(nums[right ** 2) right -= 1 return ans[::-1] ``` 最后是Leetcode 209题,题目要求在给定的数组中找到长度最小数组,使得数组的和大于等于给定的目标值。这里可以使用滑动窗口的方法来解决问题。使用两个指针来表示滑动窗口的左边界和右边界,通过移动指针来调整滑动窗口的大小,使得滑动窗口中的元素的和满足题目要求。具体实现的代码如下: ```python def minSubArrayLen(self, target: int, nums: List[int]) -> int: left = 0 right = 0 ans = float('inf') total = 0 while right < len(nums): total += nums[right] while total >= target: ans = min(ans, right - left + 1) total -= nums[left] left += 1 right += 1 return ans if ans != float('inf') else 0 ``` 以上就是第二十二天的算法训练营的内容。通过这些题目的练习,可以提升对双指针和滑动窗口等算法的理解和应用能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值