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

网站站长统计怎么做sem运营

网站站长统计怎么做,sem运营,php精品网站建设,国内气膜馆建造商记录今天完成的几道 LeetCode 算法题。 713. 乘积小于 K 的子数组 题目 思路 滑动窗口 解题过程 我们可以使用滑动窗口来解决这个问题。维护一个窗口 [left, right],并记录窗口内元素的乘积 sum。 初始化 left 0, right 0, sum 1, ret 0。right 指针向右遍历数…

记录今天完成的几道 LeetCode 算法题。


713. 乘积小于 K 的子数组

题目

题目描述截图

思路

滑动窗口

解题过程

我们可以使用滑动窗口来解决这个问题。维护一个窗口 [left, right],并记录窗口内元素的乘积 sum

  1. 初始化 left = 0, right = 0, sum = 1, ret = 0
  2. right 指针向右遍历数组 nums
  3. 每次 right 移动,将 nums[right] 乘入 sum
  4. 使用 while 循环检查 sum 是否大于等于 k。如果 sum >= k,说明当前窗口不合法(乘积过大),需要缩小窗口。将 nums[left]sum 中除掉,并将 left 指针右移 (left++)。持续这个过程直到 sum < k 或者 left > right
  5. sum < k 时,以 right 结尾的所有子数组(从 nums[left..right]nums[right..right])的乘积都小于 k。这些子数组的数量等于当前窗口的长度 right - left + 1。将这个数量累加到结果 ret 中。
  6. right 指针继续移动,重复步骤 3-5,直到 right 到达数组末尾。

注意:while 循环的条件 left <= right 确保了即使单个元素 nums[right] 就大于等于 kleft 也能正确地移动到 right + 1,使得窗口长度为 0,不会错误地增加计数。

复杂度

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组 nums 的长度。leftright 指针都最多移动 n n n 次。
  • 空间复杂度: O ( 1 ) O(1) O(1),只使用了常数级别的额外空间。

Code

class Solution {public int numSubarrayProductLessThanK(int[] nums, int k) {// 处理 k <= 1 的情况,因为数组元素都是正数,乘积不可能小于等于 1(除非是空数组,但题目约束 nums.length >= 1)// 如果 k <= 1,任何正整数的乘积都不可能小于 k,所以结果为 0。if (k <= 1) {return 0;}int ret = 0, sum = 1;for (int left = 0, right = 0; right < nums.length; right++) {sum *= nums[right];// 当 sum >= k 时,需要缩小窗口while (sum >= k) {// 注意:因为上面已经判断 k > 1 且 nums[i] >= 1,所以 sum 不会是 0,可以安全地做除法// 同时,因为 sum >= k >= nums[left],所以 left 不会超过 rightsum /= nums[left++];}// 此时窗口 [left, right] 内所有元素的乘积 < k// 以 right 结尾的有效子数组有 right - left + 1 个ret += (right - left + 1);}return ret;}
}

622. 设计循环队列

题目

题目描述截图

思路

使用数组模拟循环队列。

解题过程

  1. 使用一个固定大小的数组 elem 来存储队列元素。
  2. length 记录数组容量(即队列容量 k)。
  3. size 记录当前队列中的元素个数。
  4. head 指向队首元素的索引。
  5. tail 指向下一个待插入位置的索引。
  6. 循环的关键:当 headtail 需要移动时,使用取模运算 % length 来实现循环。例如,入队后 tail = (tail + 1) % length,出队后 head = (head + 1) % length
  7. 判空/判满:队列为空的条件是 size == 0;队列已满的条件是 size == length
  8. 获取队尾元素 Rear():队尾元素实际存储在 tail 指向位置的前一个索引。为了正确处理 tail 为 0 时(此时逻辑上的队尾在数组末尾 length - 1 处)的情况,使用 (tail - 1 + length) % length 来计算队尾元素的实际索引。

复杂度

  • 时间复杂度: 初始化和各个方法(enQueue, deQueue, Front, Rear, isEmpty, isFull)都是 O ( 1 ) O(1) O(1)
  • 空间复杂度: O ( k ) O(k) O(k),需要一个大小为 k k k 的数组来存储队列元素。

Code

class MyCircularQueue {private int[] elem; // 存储元素的数组private int head;   // 队首指针(索引)private int tail;   // 队尾指针(下一个要插入的位置的索引)private int size;   // 当前队列中的元素数量private int length; // 队列容量public MyCircularQueue(int k) {length = k;elem = new int[length];head = 0;tail = 0;size = 0;}// 入队操作public boolean enQueue(int value) {if (isFull()) { // 队列已满,无法入队return false;}elem[tail] = value; // 在队尾指针处放入元素tail = (tail + 1) % length; // 队尾指针后移(循环)size++; // 元素数量增加return true;}// 出队操作public boolean deQueue() {if (isEmpty()) { // 队列为空,无法出队return false;}// 队首元素不需要显式移除,只需移动 head 指针head = (head + 1) % length; // 队首指针后移(循环)size--; // 元素数量减少return true;}// 获取队首元素public int Front() {if (isEmpty()) {return -1; // 队列为空}return elem[head]; // 返回队首指针处的元素}// 获取队尾元素public int Rear() {if (isEmpty()) {return -1; // 队列为空}// 队尾元素在 tail 指针的前一个位置// 需要处理 tail = 0 的情况,此时队尾在数组末尾int rearIndex = (tail - 1 + length) % length;return elem[rearIndex];}// 检查队列是否为空public boolean isEmpty() {return size == 0;}// 检查队列是否已满public boolean isFull() {return size == length;}
}/*** Your MyCircularQueue object will be instantiated and called as such:* MyCircularQueue obj = new MyCircularQueue(k);* boolean param_1 = obj.enQueue(value);* boolean param_2 = obj.deQueue();* int param_3 = obj.Front();* int param_4 = obj.Rear();* boolean param_5 = obj.isEmpty();* boolean param_6 = obj.isFull();*/

2904. 最短且字典序最小的美丽子字符串 (复习)

题目

题目描述截图

思路回顾

这次复习完美解决了问题。核心思路仍然是滑动窗口,找到所有包含 k 个 ‘1’ 的子串,然后在这些子串中比较长度和字典序。

详细的题解请看之前的博文:每日算法-250329

代码

class Solution {public String shortestBeautifulSubstring(String s, int k) {String retString = "";int n = s.length();int retLen = n + 1;int count = 0;for (int left = 0, right = 0; right < n; right++) {char in = s.charAt(right);// 进窗口if (in == '1') {count++;}// 判断与收缩while (count >= k) {if (count == k) {int len = right - left + 1;// 更新结果String currentSub = s.substring(left, right + 1);if (len < retLen) {retLen = len;retString = currentSub;} else if (len == retLen) {if (retString.isEmpty() || currentSub.compareTo(retString) < 0) {retString = currentSub;}}}// 出窗口if (s.charAt(left) == '1') {count--;}left++;}}return (retLen == n + 1) ? "" : retString;}
}

1234. 替换子串得到平衡字符串 (复习)

题目

题目描述截图

思路回顾

这次复习时遇到了一个小问题:忘记处理输入字符串本身就已经平衡的情况(即每个字符出现次数都等于 n/4)。如果一开始就平衡,应该直接返回 0。不处理这个边界情况,会导致后续滑动窗口的 while 循环条件一直满足(因为所有字符的计数都 <= m),使得 left 指针不断自增,最终可能导致数组越界。

核心思路是滑动窗口,目标是找到一个最短的子串,替换掉这个子串后,原字符串中剩余部分的 Q, W, E, R 字符数量都不超过 n/4。这等价于找到一个最短的窗口 [left, right],使得窗口外的字符计数满足平衡条件。

详细的题解请看之前的博文:每日算法-250330

代码

class Solution {public int balancedString(String ss) {char[] s = ss.toCharArray();int n = s.length;int ret = n + 1, m = n / 4;int[] hash = new int[128];for (char c : s) {hash[c]++;}if (hash['Q'] == m && hash['W'] == m && hash['E'] == m && hash['R'] == m) {return 0;}for (int left = 0, right = 0; right < n; right++) {hash[s[right]]--;while (hash['Q'] <= m && hash['W'] <= m && hash['E'] <= m && hash['R'] <= m) {ret = Math.min(ret, right - left + 1);hash[s[left++]]++;}}return ret;}
}

http://www.dtcms.com/wzjs/167340.html

相关文章:

  • 学动漫设计好就业吗seo去哪里学
  • 在虚拟主机上建设多个网站网站推广的途径有哪些
  • 有关建设的新闻网站百度图片识别搜索
  • 上海医疗器械网站前置审批商丘seo优化
  • 高级的网站建设高端网站建设制作
  • 专业网站建设教程浏览器大全网站
  • 个人网站模块手机百度搜索app
  • 网站的建设与维护3步打造seo推广方案
  • 日照seo优化公司网站关键词排名优化推广软件
  • 企业网站建设空间咖啡seo是什么意思
  • 西安行业网站制作现在推广什么app最挣钱
  • 成都网站制作怎么收费品牌宣传有哪些途径
  • 西安有哪些做网站建设的公司百度一下官方下载安装
  • 北京制作公司网站外贸怎么建立自己的网站
  • 网页设计课程报告四年级下册数学优化设计答案
  • 黄浦网站设计网站引流推广软件
  • 网站招牌模板google seo是什么
  • 罗湖做网站公司排名seo外包公司兴田德润官方地址
  • 大连网站制作流程外贸接单平台哪个最好
  • 怎么创一个网站东莞寮步最新通知
  • 做网站推广哪家公司好网站排名查询工具
  • 网站建设流程图visio百度帐号管家
  • 商户网站建设公司google推广教程
  • 汕头市门户网站建设电商网站建设公司哪家好
  • 做的网站上更改内容改怎么办怎样在网上推广自己的产品
  • wordpress主题应该怎么添加谷歌搜索引擎优化
  • 网站设计论文题目网上营销网站
  • 建设购物网站流程今天国际新闻大事
  • 福田做网站公司怎么选择北京seo网站优化培训
  • 网站整体架构长沙官网seo技巧