力扣爆刷第103天之CodeTop100五连刷1-5

2024-03-24 08:28

本文主要是介绍力扣爆刷第103天之CodeTop100五连刷1-5,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

力扣爆刷第103天之CodeTop100五连刷1-5

文章目录

      • 力扣爆刷第103天之CodeTop100五连刷1-5
      • 一、3. 无重复字符的最长子串
      • 二、206. 反转链表
      • 三、146. LRU 缓存
      • 四、215. 数组中的第K个最大元素
      • 五、25. K 个一组翻转链表

一、3. 无重复字符的最长子串

题目链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/
思路:求最长无重复子串,典型滑动窗口,用set记录是否重复,无重扩大窗口,有重缩小窗口,每次添加元素后更新最大值。

class Solution {public int lengthOfLongestSubstring(String s) {int max = 0;Set<Character> set = new HashSet<>();int slow = 0;for(int i = 0; i < s.length(); i++) {while(set.contains(s.charAt(i))) {set.remove(s.charAt(slow));slow++;}set.add(s.charAt(i));max = Math.max(max, set.size());}return max;}
}

二、206. 反转链表

题目链接:https://leetcode.cn/problems/reverse-linked-list/description/
思路:翻转链表采用头插法,一个指针指向虚拟头结点保持不动,另一个指针每次向后走,进行头插。

class Solution {public ListNode reverseList(ListNode head) {ListNode root = new ListNode();ListNode p = head;while(p != null) {ListNode pre = p.next;p.next = root.next;root.next = p;p = pre;}return root.next;}
}

三、146. LRU 缓存

题目链接:https://leetcode.cn/problems/lru-cache/description/
思路:非常经典的题目,最近最少使用,我们需要构建一个双向链表和哈希表,其中双向链表应该有虚拟的头结点和尾结点,方便进行添加删除操作,其他的是常规操作。
在这里插入图片描述

class LRUCache {int capacity;Map<Integer, Node> map;DoubleList list;public LRUCache(int capacity) {this.capacity = capacity;map = new HashMap<>();list = new DoubleList();}public int get(int key) {if(!map.containsKey(key)) return -1;Node temp = map.get(key);makeRecently(temp);return temp.value;}public void put(int key, int value) {if(map.containsKey(key)) {Node temp = map.get(key);temp.value = value;makeRecently(temp);return;}if(list.size == capacity) {Node temp = list.deleteFirst();map.remove(temp.key);}Node temp = new Node(key, value);list.add(temp);map.put(key, temp);}void makeRecently(Node temp) {list.delete(temp);list.add(temp);}
}class DoubleList {int size = 0;Node start, end;DoubleList() {start = new Node();end = new Node();start.right = end;end.left = start;}void delete(Node temp) {temp.left.right = temp.right;temp.right.left = temp.left;temp.left = null;temp.right = null;size--;}Node deleteFirst() {if(start.right == end) return null;Node temp = start.right;delete(temp);return temp;}void add(Node temp) {end.left.right = temp;temp.left = end.left;temp.right = end;end.left = temp;size++;}
}class Node{int key, value;Node left, right;Node(){}Node(int k, int v) {key = k;value = v;}
}

四、215. 数组中的第K个最大元素

题目链接:https://leetcode.cn/problems/kth-largest-element-in-an-array/description/
思路:使用快速排序超时,又要求时间复杂度为O(N),使用桶排序最合数不过了。
桶排序:即把所有的数作为索引,放到一个新数组里去,即放到桶里,出现多次即累加,然后从后往前遍历减去次数,即可得到第K个最大的元素。

class Solution {public int findKthLargest(int[] nums, int k) {int[] count = new int[20001];for(int i : nums) {count[i + 10000]++;}for(int i = 20000; i > 0; i--) {k = k - count[i];if(k <= 0) return i - 10000; }return 0;}}

快排:

class Solution {public int findKthLargest(int[] nums, int k) {quickSort(nums, 0, nums.length-1);return nums[nums.length - k];}void quickSort(int[] nums, int left, int right) {if(left >= right) return;int base = nums[left];int i = left, j = right;while(i < j) {while(nums[j] >= base && i < j) j--;while(nums[i] <= base && i < j) i++;swap(nums, i, j);}swap(nums, left, j);quickSort(nums, left, j-1);quickSort(nums, j+1, right);}void swap(int[] nums, int x, int y) {int t = nums[x];nums[x] = nums[y];nums[y] = t;}
}

五、25. K 个一组翻转链表

题目链接:https://leetcode.cn/problems/reverse-nodes-in-k-group/description/
思路:

K个一组翻转,头插法、尾插法都可以,头插法需要虚拟头结点,尾插法不需要。
下面使用头插法。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode reverseKGroup(ListNode head, int k) {ListNode root = new ListNode(-1, head);ListNode slow = root, fast =head;int i = 0;while(fast != null) {i++;fast = fast.next;if(i % k == 0) {slow = reverse(slow, fast);}}return root.next;}ListNode reverse(ListNode a, ListNode b) {ListNode r = a, p1 = a.next, p2 = p1;r.next = null;while(p1 != b) {ListNode pre = p1.next;p1.next = r.next;r.next = p1;p1 = pre;}p2.next = b;return p2;}}

这篇关于力扣爆刷第103天之CodeTop100五连刷1-5的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/841003

相关文章

力扣SQL50 每位经理的下属员工数量 join

Problem: 1731. 每位经理的下属员工数量 👨‍🏫 参考题解 Code select m.Employee_id, m.name,count(*) reports_count,round(avg(e.age),0) average_agefrom Employees ejoin Employees mon e.reports_to = m.Employee_id

力扣SQL50 游戏玩法分析 IV 子查询

Problem: 550. 游戏玩法分析 IV 👨‍🏫 参考题解 这个SQL查询的目的是计算每个玩家在登录后的第二天参与活动的比例。查询使用了子查询和左连接来实现这一目的。下面是查询的详细解释,包括每个部分的作用和注释: -- 计算每个玩家登录后第二天参与活动的比例select round(avg(a.event_date is not null), 2) as fractio

力扣-2663

题目 如果一个字符串满足以下条件,则称其为 美丽字符串 : 它由英语小写字母表的前 k 个字母组成。它不包含任何长度为 2 或更长的回文子字符串。 给你一个长度为 n 的美丽字符串 s 和一个正整数 k 。 请你找出并返回一个长度为 n 的美丽字符串,该字符串还满足:在字典序大于 s 的所有美丽字符串中字典序最小。如果不存在这样的字符串,则返回一个空字符串。 对于长度相同的两个字符串 a

力扣SQL50 超过5名学生的课

Problem: 596. 超过5名学生的课 Code select classfrom coursesgroup by classhaving count(distinct student) >= 5;

力扣刷题 杨辉三角(使用c++ vector解法)

杨辉三角 题目描述示例1示例2提示:代码 题目描述 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例1 输入: numRows = 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例2 输入: numRows = 1

力扣SQL50 求关注者的数量 分组计数

Problem: 1729. 求关注者的数量 Code select user_id, count(1) followers_countfrom Followers group by user_idorder by user_id;

力扣SQL50 销售分析III having + 条件计数

Problem: 1084. 销售分析III 👨‍🏫 参考题解 Code select s.product_id,p.product_namefrom sales s left join product pon s.product_id = p.product_idgroup by product_idhaving count(if(sale_date between

随想录 Day 66 101. 孤岛的总面积 102. 沉没孤岛 103. 水流问题

随想录 Day 66 101. 孤岛的总面积 102. 沉没孤岛 103. 水流问题 101. 孤岛的总面积 101. 孤岛的总面积 时间限制:1.000S 空间限制:256MB 题目描述 给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩阵内部、所有单元格都不接触边缘的岛屿。 现在你需要计算所有孤

每日一题——Python代码实现力扣1. 两数之和(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 菜鸡写法 代码分析 时间复杂度分析 空间复杂度分析 改进建议 我要更强 方法1: 使用哈希表(字典) 方法2: 排序和双指针 方法3: 使用集合(仅适用于特殊情况) 哲学和编程思想

194.回溯算法:组合总和||(力扣)

代码解决 class Solution {public:vector<int> res; // 当前组合的临时存储vector<vector<int>> result; // 存储所有符合条件的组合// 回溯函数void backtracing(vector<int>& candidates, int target, int flag, int index, vector<bool>&