当前位置: 首页 > wzjs >正文

怎么分辨网站是不是h5中国太空网站

怎么分辨网站是不是h5,中国太空网站,WordPress 经典编辑器,怎样模仿别人的网站记录今天学习和解决的LeetCode算法题。 92. 反转链表 II 题目 思路 本题要求反转链表中从 left 到 right 位置的节点。我们可以采用 头插法 的思路来反转指定区间的链表。 具体来说,我们首先定位到 left 位置节点的前一个节点 prev。然后,从 left 位置…

记录今天学习和解决的LeetCode算法题。


92. 反转链表 II

题目

Problem 92 Description

思路

本题要求反转链表中从 leftright 位置的节点。我们可以采用 头插法 的思路来反转指定区间的链表。

具体来说,我们首先定位到 left 位置节点的前一个节点 prev。然后,从 left 位置开始,依次将 left + 1right 位置的节点移动到 prev 节点的后面,也就是反转区间的“头部”。

解题过程

  1. 虚拟头节点 (Dummy Node): 为了方便处理 left = 1 的情况(即反转从头节点开始),我们创建一个虚拟头节点 dummy,并让 dummy.next 指向原始链表的头节点 head。最终返回结果时返回 dummy.next

  2. 定位 prev 节点: 我们需要找到反转区间的前一个节点,记为 prev。通过一个循环,将 prev 指针从 dummy 开始向后移动 left - 1 步,使其指向第 left - 1 个节点。

  3. 定位 cur 节点: cur 指针初始化为 prev.next,即反转区间的第一个节点(第 left 个节点)。

  4. 执行反转 (头插法): 进行 right - left 次操作。在每次操作中:

    • 记录 cur 的下一个节点,记为 curNext。这curNext 就是本次需要移动到反转区间头部的节点。
    • curnext 指针指向 curNext 的下一个节点,即将 curNext 从链表中暂时断开。 (cur.next = curNext.next;)
    • curNext 插入到 prev 节点的后面:让 curNextnext 指针指向当前反转区间的第一个节点 (prev.next)。 (curNext.next = prev.next;)
    • 更新 prevnext 指针,使其指向新插入的 curNext,这样 curNext 就成为了新的反转区间的第一个节点。 (prev.next = curNext;)
    • 注意:在这个过程中,cur 指针始终指向原来的第 left 个节点,它在反转后会成为反转区间的最后一个节点。 prev 指针始终不变,指向反转区间的前一个节点。
  5. 返回结果: 所有操作完成后,dummy.next 指向的就是新链表的头节点,返回 dummy.next

复杂度

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是链表的长度。需要遍历链表找到 prev 节点,然后进行 right - left 次节点移动操作。
  • 空间复杂度: O ( 1 ) O(1) O(1),只使用了常数级别的额外空间(几个指针变量)。

Code

/*** 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 reverseBetween(ListNode head, int left, int right) {// 创建虚拟头节点,简化边界处理(如 left=1)ListNode dummy = new ListNode(0);dummy.next = head;// 1. 移动 prev 指针到第 left-1 个节点ListNode prev = dummy;for (int i = 1; i < left; i++) {prev = prev.next;}// 2. cur 指针指向第 left 个节点,即反转区间的起始节点ListNode cur = prev.next;// 3. 执行头插法反转 [left, right] 区间// 进行 right - left 次操作for (int i = left; i < right; i++) {// a. 记录待移动的节点 curNextListNode curNext = cur.next;// b. cur 指向 curNext 的下一个节点,将 curNext 从链表中断开cur.next = curNext.next;// c. 将 curNext 插入到 prev 之后(成为反转区间的新头部)curNext.next = prev.next;// d. 更新 prev 的 next 指针prev.next = curNext;}// 4. 返回新链表的头节点return dummy.next;}
}

1004. 最大连续1的个数 III

题目

Problem 1004 Description

思路

本题可以使用 滑动窗口 的方法解决。

核心思想是维护一个窗口 [left, right],使得这个窗口内包含的 0 的数量不超过 k。在窗口滑动过程中,不断更新窗口的最大长度。

解题过程

  1. 初始化: 设置窗口左右边界 left = 0, right = 0,当前窗口内 0 的计数 count = 0,以及最大窗口长度 maxLen = 0
  2. 扩展窗口: 移动 right 指针向右扩展窗口。
    • 如果 nums[right]0,则 count 加 1。
  3. 收缩窗口: 当窗口内 0 的数量 count 超过 k 时,需要收缩窗口。
    • 移动 left 指针向右收缩窗口。
    • 如果移出窗口的元素 nums[left]0,则 count 减 1。
    • 持续收缩直到 count <= k
  4. 更新结果: 在每次窗口调整(扩展或收缩)后,当前窗口 [left, right] 都是一个合法的窗口(0 的数量不超过 k)。计算当前窗口长度 right - left + 1,并更新 maxLen = Math.max(maxLen, right - left + 1)
  5. 遍历结束: 当 right 指针到达数组末尾时,maxLen 即为所求的最大连续1的个数(允许翻转 k 个0)。
  6. 返回结果: 返回 maxLen

复杂度

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组 nums 的长度。每个元素最多被 leftright 指针访问一次。
  • 空间复杂度: O ( 1 ) O(1) O(1),只使用了常数级别的额外空间。

Code

class Solution {public int longestOnes(int[] nums, int k) {int maxLen = 0; // 记录最大窗口长度int zeroCount = 0; // 记录当前窗口内 0 的个数int left = 0; // 窗口左边界// right 指针负责扩展窗口for (int right = 0; right < nums.length; right++) {// 如果新进入窗口的元素是 0,增加 zeroCountif (nums[right] == 0) {zeroCount++;}// 当窗口内 0 的数量超过 k 时,收缩窗口while (zeroCount > k) {// 如果移出窗口的元素是 0,减少 zeroCountif (nums[left] == 0) {zeroCount--;}// 移动左边界left++;}// 此时窗口 [left, right] 是合法的,更新最大长度maxLen = Math.max(maxLen, right - left + 1);}return maxLen;}
}

1658. 将 x 减到 0 的最小操作数

题目

Problem 1658 Description

思路

逆向思维 + 滑动窗口

题目要求从数组两端移除元素,使得移除元素的和等于 x,并求最小的操作次数(即移除元素的最少数量)。

我们可以反向思考:从两端移除元素,等价于在数组中间保留一段 连续 的子数组,使得这段子数组的和等于 totalSum - x

那么问题就转化为:找到数组 nums 中和为 target = totalSum - x最长 连续子数组的长度 maxLen。如果找到了这样的子数组,则最小操作数就是 n - maxLen(其中 n 是数组总长度)。如果找不到,则说明无法通过移除操作使和为 x,返回 -1

我们可以使用滑动窗口来寻找和为 target 的最长连续子数组。

解题过程

  1. 计算总和: 计算数组 nums 的总和 totalSum
  2. 计算目标和: 计算目标子数组的和 target = totalSum - x
  3. 处理边界情况:
    • 如果 target < 0,说明 xtotalSum 还大,不可能通过移除元素得到 x,直接返回 -1
    • 如果 target == 0,说明需要移除所有元素,其和才等于 x (x == totalSum)。此时最长子数组长度为 0,操作数为 n - 0 = n
  4. 滑动窗口: 使用滑动窗口寻找和为 target 的最长连续子数组。
    • 初始化 left = 0, currentSum = 0, maxLen = -1 (-1 表示尚未找到满足条件的子数组)。
    • right 指针遍历数组,扩展窗口,将 nums[right] 加入 currentSum
    • currentSum > target 时,收缩窗口:从 currentSum 中减去 nums[left],并向右移动 left 指针,直到 currentSum <= target
    • 如果 currentSum == target,说明找到了一个和为 target 的子数组 [left, right]。更新 maxLen = Math.max(maxLen, right - left + 1)
  5. 返回结果:
    • 如果 maxLen 仍然是 -1,说明没有找到和为 target 的子数组,返回 -1
    • 否则,返回 n - maxLen

复杂度

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组 nums 的长度。计算总和需要 O ( n ) O(n) O(n),滑动窗口也需要 O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1),只使用了常数级别的额外空间。

Code

class Solution {public int minOperations(int[] nums, int x) {int n = nums.length;long totalSum = 0; // 使用 long 防止整数溢出for (int num : nums) {totalSum += num;}// 计算目标子数组的和long target = totalSum - x;// 边界情况:x 比总和还大,无解if (target < 0) {return -1;}// 边界情况:x 等于总和,需要移除所有元素if (target == 0) {return n;}int maxLen = -1; // 记录和为 target 的最长子数组长度,初始化为 -1 表示未找到long currentSum = 0;int left = 0;// 滑动窗口寻找和为 target 的最长子数组for (int right = 0; right < n; right++) {currentSum += nums[right];// 当窗口和大于 target 时,收缩窗口while (currentSum > target && left <= right) {currentSum -= nums[left];left++;}// 如果窗口和等于 target,更新 maxLenif (currentSum == target) {maxLen = Math.max(maxLen, right - left + 1);}}// 如果 maxLen 仍为 -1,说明找不到和为 target 的子数组,返回 -1// 否则,返回 n - maxLenreturn maxLen == -1 ? -1 : n - maxLen;}
}

文章转载自:

http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://00000000.pqjpw.cn
http://www.dtcms.com/wzjs/620518.html

相关文章:

  • 信阳做网站的公司设置网站字体
  • 阿里云可以建设多个网站wordpress jiathis 文章 去除
  • 大连html5网站建设费用二维码图片生成器在线制作
  • 手机网站建设教程网站建设开发模式h5
  • 培训机构网站模板大宗商品交易平台网
  • 网站用什么开发软件做网站开发一般黄了
  • 济南网站系统优化公司网站建设整体架构
  • 廊坊做网站优化的公司手游代理平台代理
  • 公司网站建设服务费怎么做账西安苗木行业网站建设价格
  • 网站建设市场背景dx365.wordpress
  • 商学院网站建设建议淘宝网站策划怎么做
  • 建设小微公司网站需要多少钱海报设计大赛
  • 宁陵县网站seo济南建设信息网站
  • 江苏网站建设工作室湖北网官网
  • 网站建设预计资金投入做视频特效的网站有哪些
  • wordpress能否做网站天水市秦州区作风建设年网站
  • 梅河口网站开发做网站需要哪些基本功能
  • 做网站公司宣传语东莞品牌网站建设多少钱
  • 祥云网站推广WordPress网站属于什么网站
  • wampserver做网站门户网站html下载
  • 网站如何做二级域名如何造网站
  • 怎么用ftp修改网站百度云网盘搜索引擎入口
  • 3gcms企业手机网站整站源码asp外贸网站源码怎么建
  • 建设地情网站的作用荆州网站建设推荐
  • 招聘网站制作公司建设网站有哪些好处
  • wordpress 多个站点网络项目个人怎么推广快
  • 汕头网站推广费用品牌网app下载
  • 网站建设原码现在哪个网站可以做外贸
  • 找小网站的关键词wordpress 内外网
  • 怎样设置个人网站免费永久网站空间