LeetCode刷题笔记(Java)---更新至645题
作者:互联网
文章目录
前言
需要开通vip的题目暂时跳过
笔记导航
点击链接可跳转到所有刷题笔记的导航链接
641. 设计循环双端队列
设计实现双端队列。
你的实现需要支持以下操作:
- MyCircularDeque(k):构造函数,双端队列的大小为k。
- insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true。
- insertLast():将一个元素添加到双端队列尾部。如果操作成功返回 true。
- deleteFront():从双端队列头部删除一个元素。 如果操作成功返回 true。
- deleteLast():从双端队列尾部删除一个元素。如果操作成功返回 true。
- getFront():从双端队列头部获得一个元素。如果双端队列为空,返回 -1。
- getRear():获得双端队列的最后一个元素。 如果双端队列为空,返回 -1。
- isEmpty():检查双端队列是否为空。
- isFull():检查双端队列是否满了。
-
解答
class MyCircularDeque { Node head; Node tail; int capacity; int size; /** Initialize your data structure here. Set the size of the deque to be k. */ public MyCircularDeque(int k) { this.capacity = k; } /** Adds an item at the front of Deque. Return true if the operation is successful. */ public boolean insertFront(int value) { if(size == capacity)return false; Node node = new Node(value); if(head == null){ head = node; tail = node; size = 1; }else{ head.pre = node; node.next = head; head = node; size++; } return true; } /** Adds an item at the rear of Deque. Return true if the operation is successful. */ public boolean insertLast(int value) { if(size == capacity)return false; Node node = new Node(value); if(tail == null){ tail = node; head = node; size = 1; }else{ tail.next = node; node.pre = tail; tail = node; size++; } return true; } /** Deletes an item from the front of Deque. Return true if the operation is successful. */ public boolean deleteFront() { if(size == 0)return false; if(size == 1){ head = null; tail = null; size = 0; }else{ Node p = head.next; head.next = null; head = p; head.pre = null; size--; } return true; } /** Deletes an item from the rear of Deque. Return true if the operation is successful. */ public boolean deleteLast() { if(size == 0)return false; if(size == 1){ head = null; tail = null; size = 0; }else{ Node p = tail.pre; tail.pre = null; tail = p; tail.next = null; size--; } return true; } /** Get the front item from the deque. */ public int getFront() { if(size == 0)return -1; return head.val; } /** Get the last item from the deque. */ public int getRear() { if(size == 0)return -1; return tail.val; } /** Checks whether the circular deque is empty or not. */ public boolean isEmpty() { return size == 0; } /** Checks whether the circular deque is full or not. */ public boolean isFull() { return size == capacity; } class Node{ int val; Node pre; Node next; public Node(int val){ this.val = val; } } }
-
分析
- 模仿LinkedList 实现的双端队列,队中的结点定义为Node
- Node结点属性包括 前驱 后继,本身的值。
- 容量k 赋值给capacity 标记双端队列的最大值。
- size为双端队列的实际容量。
-
提交结果
643. 子数组最大平均数 I
给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。
-
解答
public double findMaxAverage(int[] nums, int k) { double res = -(30000 * 10000 + 1); double sum = 0; for(int i = 0;i < nums.length;i++){ if(i < k){ sum += nums[i]; continue; } res = Math.max(res,sum); sum -= nums[i-k]; sum += nums[i]; } res = Math.max(res,sum); return res/k; }
-
分析
- 滑动窗口
- 求窗口内的最大值平均值
-
提交结果
645. 错误的集合
集合 S 包含从1到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复。
给定一个数组 nums 代表了集合 S 发生错误后的结果。你的任务是首先寻找到重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
-
解答
public int[] findErrorNums(int[] nums) { Arrays.sort(nums); int[] res = new int[2]; int last = nums[0]; for(int i = 1;i < nums.length;i++){ if(nums[i] == last){ res[0] = nums[i]; break; } last = nums[i]; } int r = 0; for(int i = 0;i < nums.length;i++){ r ^= i+1; if(nums[i] == res[0])continue; r ^= nums[i]; } r ^= res[0]; res[1] = r; return res; }
-
分析
- 数组排序,相同的数字必定出现在相邻的位置。第一个for找到重复的数字
- 第二个for循环 利用异或 来找到只出现一次的数字 也就是丢失的那个数字
-
提交结果
标签:Java,nums,int,双端,---,tail,645,return,size 来源: https://blog.csdn.net/gongsenlin341/article/details/112258986