首页 > 其他分享 >leetcode刷题笔记8.5-8.9

leetcode刷题笔记8.5-8.9

时间:2024-08-12 14:53:31浏览次数:14  
标签:arr 8.5 val 8.9 复杂度 元素 int 数组 leetcode

刷题笔记8.5-8.9

刷题顺序依照labuladong算法小抄

两数之和(8.5)

  1. 初始化数组:
    int[] num = new int<length>;
    int[] num = {1,2,3,4};
    其中数组名代表指针变量,故不可以直接将数组名a赋值给数组名b
    错误的复制:int[] b = a;
  2. 数组元素复制:
    假设数组nums的元素复制到numsSort中:
    int[] numsSort = (int[])Arrays.copyOf(nums,nums.length)
    意为为numsSort指向的存储区内开辟nums.length长度的空间,并复制nums
  3. 调用Arrays静态类中的方法可以直接操作数组
    1) 数组默认升序排列:Arrays.sort(nums)
  4. 使用arraylist.indexOf(Object o)来定位指定元素索引
    第一步:一个数组或者其他集合类创建一个不可变的 List 集合时,我们可以使用 Arrays.asList() 来方便地转换
String[] array = {"a","b","c","d"}; // 现有静态数组或集合
List<String> list = Array.asList(array); // 转换为长度不可变的Arraylist

或者直接赋值

List<String> list = Arrays.asList("a", "b", "c")

第二步:int index = list.indexOf("b");
【注意】
Arrays.asList() 不支持基本数据类型的数组,只能接受 Object 类型的参数或者数组。基本数据类型(如 int, double, char 等)不是 Object 的子类,所以不能直接作为 Arrays.asList() 的参数。
如果传入一个基本数据类型的数组,Arrays.asList() 会把它当作一个 Object 类型的元素,而不是把它的每个元素当作 Object 类型。这样就会导致返回的 List 只有一个元素,就是原始数组本身。

  • 如果想要把一个基本数据类型的数组转换成 List
    使用循环遍历数组,并把每个元素添加到 List 中。这样可以利用自动装箱(autoboxing)的特性,把基本数据类型转换成对应的包装类(如 Integer, Double, Character 等)。
List<Integer> list = new ArrayList<>();
int[] array = {1,2,3};
for(int num:array){
  list.add(num);
}

刷题总结(8.6)

  1. 静态数组在创建的时候就要确定数组的元素类型和元素数量,连续内存必须一次性分配,分配完了之后就不能随意增减了
int[] nums = new int[4];

Java Golang 这种语言,静态数组创建出来后会自动帮你把元素值都初始化为 0,所以不需要再显式进行初始化。
2. 动态数组底层还是静态数组,只是自动帮我们进行数组空间的扩缩容,并把增删查改操作进行了封装,让我们使用起来更方便而已

// 创建动态数组
// 不用显式指定数组大小,它会根据实际存储的元素数量自动扩缩容
ArrayList<Integer> arr = new ArrayList<>();

for (int i = 0; i < 10; i++) {
    // 在末尾追加元素,时间复杂度 O(1)
    arr.add(i);
}

// 在中间插入元素,时间复杂度 O(N)
// 在索引 2 的位置插入元素 666
arr.add(2, 666);

// 在头部插入元素,时间复杂度 O(N)
arr.add(0, -1);

// 删除末尾元素,时间复杂度 O(1)
arr.remove(arr.size() - 1);

// 删除中间元素,时间复杂度 O(N)
// 删除索引 2 的元素
arr.remove(2);

// 根据索引查询元素,时间复杂度 O(1)
int a = arr.get(0);

// 根据索引修改元素,时间复杂度 O(1)
arr.set(0, 100);

// 根据元素值查找索引,时间复杂度 O(N)
int index = arr.indexOf(666);
  1. 广义的(双指针)链表
    数据结构体定义
private static class Node<E> {
    E val; // 结点存储的数值
    Node<E> next; // 当前结点指向的下一个
    Node<E> prev; // 当前结点指向的上一个

    Node(Node<E> prev, E element, Node<E> next) {
        this.val = element;
        this.next = next;
        this.prev = prev;
    }
}

一条链表并不需要一整块连续的内存空间存储元素。链表的元素可以分散在内存空间的天涯海角,通过每个节点上的 next, prev 指针,将零散的内存块串联起来形成一个链式结构。

刷题总结(8.8)

  1. 关于优先级队列:
    使用场景:对k个元素排序,将数组/序列抽象为二叉堆
    使用方法:
  • 优先级队列初始化:
// 堆排序伪码,对 arr 原地排序
// 时间复杂度 O(NlogN),空间复杂度 O(N)
int[] heapSort(int[] arr) {
    int[] res = new int[arr.length];
    PriorityQueue<int> pq = new MyPriorityQueue<>();
    for (int x : arr)
        pq.push(x);
    // 元素出堆的顺序是有序的
    for (int i = 0; i < arr.length; i++)
        res[i] = pq.pop();
    return res;
}
  • 优先级队列按特定规则比较排序
PriorityQueue<ListNode> pq = new PriorityQueue<>(
            lists.length, (a, b)->(a.val - b.val));

(a, b)->(a.val - b.val)是一个lambda表达式,它定义了优先队列中元素的排序规则。在Java中,优先队列默认是一个最小堆,这意味着它将根据提供的比较器来维护元素的顺序,使得队列头部始终是“最小”的元素。
a.val - b.val是一个比较操作,它比较两个ListNode对象的val值。根据这个比较结果,优先队列确定元素的顺序,即 如果a.val - b.val的结果小于0,那么a将被视为比b小,a会排在b前面。
综上,上面这段代码表示:优先队列存储着ListNode类型的元素,但队列是按照ListNode对象的val字段进行排序,确保具有最小val值的ListNode对象始终位于队列的头部。

  • 注意:优先级队列中的元素不可为空,否则会报java.lang.NullPointerException,在执行pq.add(x)时跟随判断

标签:arr,8.5,val,8.9,复杂度,元素,int,数组,leetcode
From: https://www.cnblogs.com/Wyuf1314/p/18343757

相关文章

  • Leetcode. 11
    这个题开始之前我们首先做一个思路的分析随着这个柱子的不断的变化这个容器中的水也是会跟着相应的变大和变小的所以我们先找出这个里面的规律在每个状态下,无论长板或短板向中间收窄一格,都会导致水槽底边宽度−1​变短:若向内移动短板,水槽的短板min(h[i],h[j])......
  • LeetCode 1834. Single-Threaded CPU
    原题链接在这里:https://leetcode.com/problems/single-threaded-cpu/description/题目:Youaregiven n​​​​​​taskslabeledfrom 0 to n-1 representedbya2Dintegerarray tasks,where tasks[i]=[enqueueTimei,processingTimei] meansthatthe i​​......
  • 2024.8.9
    ATM机交互插卡输入密码选择功能存款1Python的与用户交互input('请输入瑞星卡号')input('输入密码')请输入瑞星卡号5201314输入密码15236'15236'print('*'*100)*******************************************************************************......
  • LeetCode 22. 括号生成 回溯写法详解
    22.括号生成22.括号生成题目来源题目分析题目难度题目标签题目限制解题思路核心算法步骤代码实现代码解读性能分析测试用例扩展讨论优化写法其他实现总结22.括号生成题目来源22.括号生成题目分析给定一个数字n,表示生成括号的对数,要求设计一个函数生成所......
  • LeetCode 216. 组合总和 III 回溯写法详解
    216.组合总和III216.组合总和III题目来源题目分析题目难度题目标签题目限制解题思路核心算法步骤代码实现代码解读性能分析测试用例扩展讨论优化写法其他实现总结216.组合总和III题目来源216.组合总和III题目分析题目要求找出所有相加之和为n的k......
  • Leetcode 热题100 - 155 最小栈
    Leetcode热题100-155最小栈1.题目描述2.解题思路3.代码实现(方法二)4.c++知识点用法1.题目描述155最小栈2.解题思路方法一:创建一个辅助栈min_stk用以存储当前元素相对应的栈中最小元素值;方式二:类似于方法一,使用pair<int,int>同时存储当前元素与其对应......
  • Leetcode-3129 找出所有稳定的二进制数组I
    Leetcode-3129找出所有稳定的二进制数组I1.题目描述2.解题思路3.代码实现1.题目描述3129找出所有稳定的二进制数组I2.解题思路(1)定义f[i][j][k]表示i个0、j个1且当前位i+j填写值为k=0/1的所有情况;(2)对于f[i][0][0]、f[0][j][1]初始化为1,注意到:......
  • Leetcode-3132 找出与数组相加的整数II
    Leetcode-3132找出与数组相加的整数II1.题目描述2.解题思路3.代码实现1.题目描述3132找出与数组相加的整数II2.解题思路(1)排序后,注意到nums1数组比nums2数组多两个元素,可推出最小匹配元素一定在nums[0]、nums[1]、nums[2]中出现;(2)优先从nums[2]进行判......
  • 「LeetCode Top100」之滑动窗口
    3.无重复字符的最长子串题目链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/?envType=study-plan-v2&envId=top-100-liked题目难度:中等标签:哈希表、字符串、滑动窗口题目状态:学习题解思路:滑动窗口的思路,也就是维持一个无......
  • GitHub每日最火火火项目(8.9)
    项目名称:bghira/SimpleTuner项目介绍:SimpleTuner是一个通用的微调工具包,主要面向StableDiffusion2.1、StableDiffusion3、DeepFloyd和SDXL等模型。它旨在为这些模型提供一种便捷的微调方式,以适应不同的应用场景和需求。通过SimpleTuner,用户可以调整模型的参数,提高模......