IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 乘积小于K的子数组之滑动窗口 -> 正文阅读

[数据结构与算法]乘积小于K的子数组之滑动窗口

前言

滑动窗口可以解决连续子数组问题,以O(n)的时间复杂度为开销。每个节点最多访问两个,所以要思考O(n2)为什么每个节点要被访问N次?

一、乘积小于K的子数组

在这里插入图片描述

二、题解

滑动窗口,每改变一次窗口大小,记一部分数,如此反复,每次计自己该计的数,不给下一次带来额外麻烦。各司其职,完成大问题的解决。

package com.xhu.offer.offerII;

//乘积小于K的子数组
public class NumSubarrayProductLessThanK {
    //总结:注意审题,都是正整数,这些条件可能是降低时空的因素,甚至可能是解题的关键。
    //总结:代码是给机器看的,是教机器一步一步解决问题的,也就是拆解了问题,不要上来就想if解决所有问题,要拆解成一块一块的循环体。
    //总结:找到规律,即核心迭代块。(所以说循环很关键,循环思维真的很关键。)人要有算法的解决问题,不是暴力解决问题,这样机器才能按照算法走,减少计算量。
    //总结:从小问题到大问题,多个简单问题堆叠成一个复杂问题,复杂性体现在多个简单问题之间碰撞所产生的多现象性。看起来就会很复杂,需挖掘复杂问题中暗含的简单问题。
    //人脑知道该以这样的方式来算,但是没这个时间和超强记忆力,只是借助计算机来算,而思想体现在自己的逻辑,这个逻辑体现在巧妙,而不是时空量去堆积。
    //算法题就是用来训练逻辑的,没有那么多的if,主要是循环的核心体,和相应的数据结构应用。(这是面对算法体的态度和角度去看它,去挖掘,不是无方向无目的的)
    //以整体的方式看数组,比如把数组拆成左中右数组;以局部的方式看内部处理;从局部解决向整体靠近,完成整体的解决。
    //如,当数组只有一个元素时,该怎么解决?有两个时,该怎么解决?有三个时,可不可以利用2+1解决?n个时,是否可以当作(n - 1) + 1解决。不同情况的相同解决点在那里?
    public int numSubarrayProductLessThanK(int[] nums, int k) {
        //滑动窗口,毕竟都是正整数。
        if (k == 0) return 0;

        int count = 0;

        int begin = 0, sum = 1;
        for (int i = 0; i < nums.length; i++) {
            sum *= nums[i];

            if (sum < k) count += i - begin + 1;//关键代码,关键思想体现,只要连续子数组的sum小于k,那么就有subNums.length个积小于K
            if (sum >= k) {
                while (begin <= i) if ((sum /= nums[begin++]) < k) break;

                count += i - begin + 1;
            }
        }
        return count;
    }
}

总结

1)总结:注意审题,都是正整数,这些条件可能是降低时空的因素,甚至可能是解题的关键。
2)总结:代码是给机器看的,是教机器一步一步解决问题的,也就是拆解了问题,不要上来就想if解决所有问题,要拆解成一块一块的循环体。
3)总结:找到规律,即核心迭代块。(所以说循环很关键,循环思维真的很关键。)人要有算法的解决问题,不是暴力解决问题,这样机器才能按照算法走,减少计算量。
4)总结:从小问题到大问题,多个简单问题堆叠成一个复杂问题,复杂性体现在多个简单问题之间碰撞所产生的多现象性。看起来就会很复杂,需挖掘复杂问题中暗含的简单问题。
5)人脑知道该以这样的方式来算,但是没这个时间和超强记忆力,只是借助计算机来算,而思想体现在自己的逻辑,这个逻辑体现在巧妙,而不是时空量去堆积。
6)算法题就是用来训练逻辑的,没有那么多的if,主要是循环的核心体,和相应的数据结构应用。(这是面对算法题的态度和角度去看它,去挖掘,不是无方向无目的的)
7)以整体的方式看数组,比如把数组拆成左中右数组;以局部的方式看内部处理;从局部解决向整体靠近,完成整体的解决。
如,当数组只有一个元素时,该怎么解决?有两个时,该怎么解决?有三个时,可不可以利用2+1解决?n个时,是否可以当作(n - 1) + 1解决。不同情况的相同解决点在那里?

参考文献

[1] LeetCode 原题

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:55:08  更:2022-02-26 11:55:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:23:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码