LeetCode刷题滑动窗口(水果成篮+找到字符串中所有字母的异位词)Java

本文深入解析LeetCode两道经典滑动窗口题:'水果成篮'(求最多含两种元素的最长连续子数组)和'找到字符串中所有字母异位词'(固定长度窗口匹配字符频次)。重点阐述双指针协同移动、哈希表/数组频次统计、窗口收缩条件及count有效性计数等核心技巧,强调从暴力解法到优化滑动窗口的思维演进过程。

一,水果成篮

题目解析:

这题的意思就是说有一个数组,里面数字就代表一个种类,就如fruits = [1,2,1]里面就有1水果和2水果这两种水果,现在我有两个篮筐,并且每个篮筐只能有一个种类的水果,并且数量可以无限,也就是说我需要在这个数组中找到一个最长的子数组,要求是这个子数组里面只能包含两种数字,那我们的解题思路首先肯定想到的是通过暴力解法,将所有的满足条件的子数组列举出来,然后找到一个最长的,具体的操作就是定义两个变量left跟right,right向后遍历,然后将指到的数据存进一个哈希表中,哈希表记录数字种类以及出现的次数,如果种类>2了,那就移动left,然后right继续从left的位置开始遍历,通过这个暴力解法,你肯定也想到了说,那我right有必要直接回到left移动后的位置从新向后遍历吗,其实可以不用,因为我们left向后移有两种情况,就是数字种类变小和不变,变小的话那肯定不用从头开始遍历,不变的话那也不需要,只用看看后面的数字种类是什么情况就好了,所以我们的right是不需要回退的,看到这里,有没有想到我们之前的滑动窗口,滑动窗口一般也就是两个指针的移动方向是一致的,那么我们这题也是这个思路,这个思路是我们从暴力解法过渡过来的,所以我们之后的解题思想都可以从这个方式来,从最简单的暴力解法,一步一步进行优化得来更好的解法

代码演示:

class Solution {
    public static int totalFruit(int[] fruits) {
        HashMap<Integer,Integer> hashMap=new HashMap<>();
        int len=0;
        for (int left = 0,right=0; right < fruits.length; right++) {
            //进窗口
            int inhash=fruits[right];
            hashMap.put(inhash,hashMap.getOrDefault(inhash,0)+1);
            //出窗口
            while (hashMap.size()>2){
                int outhash=fruits[left];
                hashMap.put(outhash,hashMap.get(outhash)-1);
                if (hashMap.get(outhash)==0){
                    hashMap.remove(outhash);
                }
                left++;
            }
            //更新结果
            len=Math.max(len,right-left+1);
        }
        return len;
    }
}

二,找到字符串中所有字母的异位词

题目解析:

可以先将字符串转为数组的形式,创建两个哈希表,其中一个哈希表hash1就放目标字符串里面的字母,以及对应的个数信息,就相当于是a:1,b:1,c:1,然后我们right移动的时候,将s[right]的字母加进另一个哈希表hash2中,然后维护一个计数count,里面记录的是有效的数据,也就是如果我第一个是e,但是我目标中没有e,所以就不进入count里面,有效的数据的具体理解也就是当hash[right]>=hash2[right],我只需要一个a,你那里有两个a,我也不会记录第二个a,当我们的right-left+1的长度大于目标的长度的时候,我们的left就++,并且当hash[left]>=hash2[left]的时候,我们count--,当count==m的时候,我们就更新结果,当然更进阶就是哈希表换成数组的形式,因为字母的个数还是不多的

代码演示:

 public static List<Integer> findAnagrams(String s, String p) {
        List<Integer> ret=new ArrayList<>();
        char[]ss=s.toCharArray();
        char[]pp=p.toCharArray();
        //先定义第一个数组,填入pp的值,并且记录下来长度
        int[]hash1=new int[26];
        int[]hash2=new int[26];
        for (char ch:pp){
            hash1[ch-'a']++;
        }
        for (int right = 0,left=0,count=0; right < ss.length; right++) {
            //进窗口
            char in=ss[right];//假设in='a'
            hash2[in-'a']++;//也就是hash2[0]++
            if (hash1[in - 'a'] >= hash2[in - 'a']){
                count++;//也就是说我可以hash2这个数组中代表a的那个格子数字大于1,但是我们count里面的有效数字只能是最准确的有什么和有几个
            }
            //出窗口
            if (right-left+1>pp.length){
                char out=ss[left];//依旧假设out='a'
                if (hash1[out-'a']>=hash2[out-'a']){
                    count--;
                }
                hash2[out-'a']--;
                left++;
            }
            // 3. 匹配成功,记录起始下标
            if (count == pp.length) {
                ret.add(left);
            }
        }
        return ret;
    }

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值