IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数组部分算法题(代码随想录) -> 正文阅读

[数据结构与算法]数组部分算法题(代码随想录)

数组

1.二分查找

题目链接

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

左闭右闭

from typing import List

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        i,j = 0,len(nums)-1
        while i <= j: # [i,j] i==j 在这个区间范围内
            m = i+ ((j-i) >> 1) # 等同于(i+j)>>1 防止 i+j溢出
            if nums[m] > target:
                j = m-1
            elif nums[m] < target:
                i = m+1
            else:
                return m
        return -1

一定要遵循循环不变量规则(坚持根据区间的定义来操作)

左闭右开

from typing import List

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        # [i,j)  j不能为len(nums)-1
        i,j = 0,len(nums)
        while i < j: # [i,j)
            m = i + ((j - i) >> 1)
            if nums[m] > target:
                j = m
            elif nums[m] < target:
                i = m+1
            else:
                return m
        return -1

2.移除元素

题目链接

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

自己的思路实现

来两个指针i,j i指向数组头部,j指向数组尾部;先遍历头部,遇到val,就遍历尾部,不是val,置换到i的位置,继续遍历i。直到i > j。

def removeElement(self, nums: List[int], val: int) -> int:
    i,j,cur = 0,len(nums) - 1,0
    while i <= j:
        if cur == i and cur!=j:
            if nums[cur] != val:
                i = i+1
                cur = i
            else:
                cur = j
        else:
            if nums[cur] != val:
                nums[i] = nums[cur]
                j = j-1
                cur = i
            else:
                j = j-1
                cur = j
    return cur+1
def removeElement(self, nums: List[int], val: int) -> int:
    i,j = 0,len(nums) - 1
    while i <= j:
        while i <= j and nums[i] != val:
            i += 1
        while i <= j and nums[j] == val:
            j -= 1
        if i < j:
            nums[i] = nums[j]
            i += 1
            j -= 1
    return i

快慢指针

思路很简单,就是没想到

  • 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
  • 慢指针:指向更新 新数组下标的位置

27.移除元素-双指针法

def removeElement(self, nums: List[int], val: int) -> int:
    slow,fast = 0,0
    for fast in range(0,len(nums)):
        if nums[fast] != val:
            nums[slow] = nums[fast]
            slow = slow + 1
        fast = fast + 1
    return slow

3.有序数组的平方

题目链接

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

def sortedSquares(self, nums: List[int]) -> List[int]:
    n = len(nums)
    if n == 0 or nums is None:
        return
    i,j,k = 0,n - 1,n - 1
    result = [-1]*n
    while i <= j:
        if abs(nums[i]) > abs(nums[j]):
            result[k] = abs(nums[i]) ** 2
            i += 1
        else:
            result[k] = abs(nums[j]) ** 2
            j -= 1
            k -= 1

    return result

4.长度最小的子数组(2)

题目链接

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

滑动窗口 前缀和 双指针

在这里插入图片描述

def minSubArrayLen(self, target: int, nums: List[int]) -> int:
    n = len(nums)
    i,j,sum,result = 0,0,0,100001

    while j < n:
        sum += nums[j]
        while sum >= target:
            result = min(result, j - i + 1)
            sum -= nums[i]
            i += 1
        j += 1
    if result == 100001:
        return 0
    return result

5.螺旋矩阵II

题目链接

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

自己Kill的,nice!!

def generateMatrix(self, n: int) -> List[List[int]]:
    array = [[0 for i in range(n)] for j in range(n)]
    d = [[0,1],[1,0],[0,-1],[-1,0]]
    mod = 0
    i,j = 0,0
    array[i][j] = 1
    for k in range(1,n ** 2):
        ii = i + d[mod][0]
        jj = j + d[mod][1]
        if 0 <= ii < n and 0 <= jj < n and array[ii][jj] == 0:
            array[ii][jj] = k + 1
        else:
            mod = (mod + 1) % 4
            ii = i + d[mod][0]
            jj = j + d[mod][1]
            array[ii][jj] = k + 1
        i = ii
        j = jj

    return array

总结

在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:52:38  更:2022-09-21 00:55:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:21:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码