yub‘s Algorithmic Adventures_Day3

yub’s Algorithmic Adventures_Day3

有序数组的平方

link:977. 有序数组的平方 - 力扣(LeetCode)
非递减顺序
一个数列中的元素从左到右依次不减,或者说不降序排列.
比如:1233445,12345.

思路分析

如果看到数组能条件反射到双指针那已经是win了.
根据题意平方之后的数一定在数组的两端.两个指针一首一尾,从后往前更新数组.
在这里插入图片描述
在这里插入图片描述

class Solution {
    public int[] sortedSquares(int[] nums) {
      //非递减数组可得最大值平方后会出现在数组两头
      int left = 0;
      int right = nums.length - 1;
      int[] result = new int[nums.length];
      int index = result.length - 1 ;
      while(left <= right) {
        if(nums[left]*nums[left] > nums[right]*nums[right]) {
            result[index--] = nums[left] * nums[left++];
           // left++;
        }else{
             result[index--] = nums[right] * nums[right--];
            //right--;
        }
    }
    return result;
  }
}

长度最小的子数组

link:209. 长度最小的子数组 - 力扣(LeetCode)

双指针变形——滑动窗口
其实也可以理解成给入队的队列一个给定的大小变成窗口,先入队元素,然后和target进行比较,大于等于target就出队先进的元素,再进新元素并且标记好原来大于等于target的数组长度.

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int begin = 0;//起始位置
        int sum = 0;//滑动窗口值总和
        int result = Integer.MAX_VALUE;//定义最大值 遍历不出错
        for(int end = 0; end < nums.length;end++) {
            sum += nums[end];
            while(sum >= target) {
                result = Math.min(result, end - begin + 1);//最小长度
                sum -= nums[begin++];
            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }
}

关键点:如何移动起始位置
如果循环中的标记位在起始位置,起始位置和终止位置都需要移动一遍和暴力解法无差别,所以我们的标记位一定是终止位.

螺旋矩阵 II

link:59. 螺旋矩阵 II - 力扣(LeetCode)
奇怪的代码掌控力… 主要问题在边界处理

顺序解决

按照本来的逻辑

class Solution {
    public int[][] generateMatrix(int n) {
     int l = 0,r = n - 1,t = 0,b = n-1;
     int[][] result = new int[n][n];
     int num = 1;
     int tar = n * n;
     while(num <= tar) {
     //第一行开始
     for(int i = l;i <= r;i++){
        result[t][i] = num++;
     }
     t++;
     for(int i = t; i <= b; i++){
        result[i][r] = num++;
     }
     r--;
     for(int i = r; i >=l; i--){
        result[b][i] = num++;
     }
     b--;
     for(int i = b;i >= t;i--) {
        result[i][l] = num++;
     }
     l++;
    }
    return result;
    }
}

改编版本
class Solution {
    public int[][] generateMatrix(int n) {
        int loop = 0;  // 控制循环次数
        int[][] res = new int[n][n];
        int start = 0;  // 每次循环的开始点(start, start)
        int count = 1;  // 定义填充数字
        int i, j;

        while (loop++ < n / 2) { // 判断边界后,loop从1开始
            // 模拟上侧从左到右
            for (j = start; j < n - loop; j++) {
                res[start][j] = count++;
            }

            // 模拟右侧从上到下
            for (i = start; i < n - loop; i++) {
                res[i][j] = count++;
            }

            // 模拟下侧从右到左
            for (; j >= loop; j--) {
                res[i][j] = count++;
            }

            // 模拟左侧从下到上
            for (; i >= loop; i--) {
                res[i][j] = count++;
            }
            start++;
        }

        if (n % 2 == 1) {
            res[start][start] = count;
        }

        return res;
    }
}

Tips

1.遇到有序数组考虑二分法.
2.双指针(找准循环不变量中的不变量).
3.求连续子数组的总和可用滑动窗口解决.

YUB-200-2017数据集是一个由国际电联ITU-T组织提供的大规模网络流量数据集。该数据集收集了2017年全球范围内的网络流量信息,并提供了广泛的数据分析和研究。数据集包含大量关于网络连接、通信协议、数据包大小、交互行为等方面的信息。YUB-200是该数据集的一个子集,以200种常见网络应用为单位进行了分类和整理。 YUB-200-2017数据集的使用具有广泛的应用价值。首先,研究人员可以使用该数据集来分析全球网络流量的特征和趋势。如通过对数据集的统计分析,可以了解网络连接的分布情况、不同网络应用的使用频率等,为网络规划和优化提供依据。其次,数据集还可以用于网络安全研究。通过对数据集的深入分析,研究人员可以发现网络中的安全漏洞和攻击事件,并开发相应的防御策略。此外,数据集还可以用于网络质量评估、网络流量预测等方面的研究。 为了能够更好地利用YUB-200-2017数据集,研究人员需要具备数据分析和统计学方面的知识,并使用相应的工具和技术进行处理。同时,研究人员还需要遵守数据保护和隐私保护的原则,在使用数据集时确保数据的安全和隐私不被泄露。 总之,YUB-200-2017数据集是一个重要的网络流量数据集,具有广泛的应用价值。通过对该数据集的分析,可以帮助我们更好地理解和优化网络的使用和安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值