首页 > 编程语言 >反证法证明, 抓住定义的意义,不惧Corner case, 抓住循环不变量 | 代码随想录算法训练营第2天| 977. 有序数组的平方、209. 长度最小的子数组、59. 螺旋矩阵

反证法证明, 抓住定义的意义,不惧Corner case, 抓住循环不变量 | 代码随想录算法训练营第2天| 977. 有序数组的平方、209. 长度最小的子数组、59. 螺旋矩阵

时间:2022-10-27 20:36:11浏览次数:80  
标签:end val nums int 随想录 start 抓住 数组 size

目录

977. 有序数组的平方 算法的正确性采用反证法证明

Problem: 977. 有序数组的平方

思路

讲述看到这一题的思路

结论: 对于非递减数列, 绝对值最大的元素一定是第0个或最后一个

反证法证明:

若是第i个绝对值最大(0<i<n-1), 则

因为|nums[i]| > |nums[0]|, 所以nums[i] > 0

因为|nums[i]| > |nums[n-1]|, 所以nums[i] < 0

矛盾!

解题方法

描述你的解题方法

双指针即可

Code


class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        l = []
        i = 0
        j = len(nums)-1
        n = len(nums)-1
        while j>=i:
            if nums[j]*nums[j] > nums[i]*nums[i]:
                l.append(nums[j]*nums[j])
                j -= 1
            else:
                l.append(nums[i]*nums[i])
                i += 1
            n -= 1
        l.reverse()
        return l

209. 长度最小的子数组 思维打开, 抓住滑动窗口定义本质与意义, 笑对Corner Cases

Problem: 209. 长度最小的子数组

看这段代码, 你会觉得极其的简洁, 我来解释一下为什么


class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        Sum = 0
        start = 0
        size = float("inf")
        for end in range(len(nums)):
            Sum += nums[end]
            while Sum >= target:
                size = min(size, end - start + 1)
                Sum -= nums[start]
                start += 1
        return 0 if size == float("inf") else size

如何定义滑动窗口?

  • start: 窗口起始
  • end: 窗口结束
  • 窗口: [start,end]构成的闭区间

那么, 我们考虑一下start和end取值的意义:

  • start < end: 不必说
  • start == end: 窗口只含有1个元素
  • start > end: 窗口为空

也就是说出现start > end(其实只有start = end+1), 是无需害怕的

这也是闭区间的意义

如果换一个定义方法?

  • start: 窗口起始
  • end: 窗口结束下一个
  • 窗口: [start,end)构成的闭区间

那么, 我们考虑一下start和end取值的意义:

  • start < end: 不必说
  • start == end: 窗口为空

代码

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        start = 0
        end = 1
        Sum = 0
        size = float("inf")
        while end <= len(nums):
            Sum += nums[end-1]
            while Sum >= target:
                size = min(size, end - start)
                Sum -= nums[start]
                start += 1
            end += 1
        return 0 if size == float("inf") else size

59. 螺旋矩阵 II 抓住循环不变量, 模拟螺旋矩阵

59. 螺旋矩阵 II

解题思路

可以把方阵的每一圈4个顶点:

  1. (i, i)
  2. (i, n-i-1)
  3. (n-i-1, n-i-1)
  4. (n-i-1, i)

以某个顶点为起始点, 下一个为结束点, 且为左开右闭即可

代码

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        x = y = 0
        val = 1
        loop = int(n/2)
        i = 0
        matrix = [[0] * n for _ in range(n)]
        while i < loop:
            while x == i and y < n-i-1:
                matrix[x][y] = val
                val += 1
                y += 1
            while y == n-i-1 and x < n-i-1: 
                matrix[x][y] = val
                val += 1
                x += 1
            while x == n-i-1 and y > i:
                matrix[x][y] = val
                val += 1
                y -= 1
            while y == i and x > i:
                matrix[x][y] = val
                val += 1
                x -= 1
            i += 1
            x += 1
            y += 1
            print(matrix)
        if n%2 != 0:
            matrix[int(n/2)][int(n/2)] = n*n
        return matrix

标签:end,val,nums,int,随想录,start,抓住,数组,size
From: https://www.cnblogs.com/ywh-pku/p/16833611.html

相关文章

  • JavaScript数组的push()等方法的使用
        数组是值得有序集合。每个值在数组中有一个位置,用数字表示,叫做索引。JavaScript数组是无类型的:数组元素可以是任何类型,而且同一个数组中可以存在不同类型元素,甚......
  • 稀疏数组
    publicclassarray1{publicstaticvoidmain(String[]args){intarray[][]=newint[11][11];array[3][4]=10;array[6][8]=12;......
  • 三维数组递归取对象
    原数组:arr=[{name:'北京',id:110000,childList:[{name:'北京',id:110001,childList:[{name:'东城',id:110101},{name:'西城',id:110102}]}]......
  • 力扣(leetcode) 88. 合并两个有序数组(双指针法)(库函数法)
    题目分析:这道题给的题目挺恶心的。就是将两个有序数组合并成一个有序数组。但是他给的数组是这样的:nums1=[1,2,3,0,0,0]这里实际上就是:nums1=[1,2,3]。后面的0只起......
  • 力扣(leetcode) 852. 山脉数组的峰顶索引(一行代码解决)(二分法)
    题目在这:​​https://leetcode-cn.com/problems/peak-index-in-a-mountain-array/​​题目分析:题目一堆数学符号看着难受。给大家解答一下,就是给了一堆数组,其中有一个数X......
  • 树状数组的板子
    该数据结构可以维护序列的前缀和 1.单点修改,求区间和#include<iostream>usingnamespacestd;constintN=5e5+2;intn,tr[N];intlowbit(intx){retu......
  • 代码随想录day22 | 235. 二叉搜索树的最近公共祖先 701. 二叉搜索树中的插入操作 45
    235.二叉搜索树的最近公共祖先题目|文章思路在二叉树公共祖先问题中,可以通过后序遍历,从二叉树节点向上遍历,找到最近公共祖先。本题中我们可以利用二叉搜索树的特性对......
  • 48、数组、字符串处理
    数组处理数组介绍及声明变量:存储单个元素的内存空间数组:存储多个元素的连续的内存空间,相当于多个变量的集合数组名和索引:索引编号从0开始,属于数值索引索引可支持使用自定义......
  • Leetcode第1822题:数组元素积的符号(Sign of product of an array)
    解题思路一个数组所有元素的乘积为正返回1,为零返回0,为负返回-1.变量pos统计正元素的个数,变量neg统计负元素的个数,遍历数组。遍历过程中如果有元素为零,直接返回0;遍历结束......
  • 数组元素积的符号
    题目已知函数 signFunc(x)将会根据x的正负返回特定值:如果x是正数,返回1。如果x是负数,返回-1。如果x是等于0,返回0。给你一个整数数组nums。令product......