菜鸡的原地踏步史05(◐‿◑)

每日一念

改掉自己想到哪写哪的坏习惯

子串

和为K的子数组

java 复制代码
class Solution {
    /**
        有点像找出和为0的子数组,只不过这里和变成了k
        不太对,尝试使用双指针+滑动窗口,完全过不去样例
        正确做法
         hashmap存放 sum -- count
         对nums中的数字进行遍历sum累加
            sum[j] - sum[i] = k,则表示此时存在一个范围i - j使得和为k
     */
    public int subarraySum(int[] nums, int k) {
        HashMap<Integer, Integer> map = new HashMap();
        map.put(0, 1);
        int sum = 0;
        int count = 0;
        for(int num: nums) {
            sum += num;
            if(map.containsKey(sum - k)) {
                count += map.get(sum - k);
            }
            map.put(sum, map.getOrDefault(sum, 0) + 1);
        }
        return count;
    }
}

滑动窗口的最大值

java 复制代码
class Solution {
    /**
        这题总该是双指针+滑动窗口了吧
        还是不对。。超时

        LinkedList创建双端队列
        queue控制后面的元素加进队尾
            如果新元素大于队中所有元素
                弹出所有元素,加入新元素(确保队首元素始终是最大值)
        控制长度 > k 弹出队首元素

        只要i >= k - 1,每次都记录res[i] = 队首
     */
    public int[] maxSlidingWindow(int[] nums, int k) {
        int[] res = new int[nums.length - k + 1];
        if(nums == null || nums.length == 0) {
            return res;
        }
        LinkedList<Integer> dequeue = new LinkedList();
        for(int i = 0; i < nums.length; i++) {
            while(!dequeue.isEmpty() && nums[i] > nums[dequeue.peekLast()]) {
                dequeue.pollLast();
            }
            dequeue.offerLast(i);

            if(i - dequeue.peekFirst() + 1 > k) {
                dequeue.pollFirst();
            }

            if(i - k + 1 >= 0) {
                res[i - k + 1] = nums[dequeue.peekFirst()];
            }
        }
        return res; 
    }
}

最小覆盖子串

java 复制代码
// 困难题,真是头皮发麻

普通数组

最大子数组

java 复制代码
class Solution {
    /**
        dp[i]表示以nums[i]结尾的最大和的连续子数组
        dp[i] -- dp[i - 1](nums[i - 1]结尾的)
     */
    public int maxSubArray(int[] nums) {
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        for(int i = 1; i < dp.length; i++) {
            dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
        }
        int max = dp[0];
        for(int i = 0; i < dp.length; i++) {
            if(dp[i] > max) {
                max = dp[i];
            }
        }
        return max;
    }
}

合并区间

java 复制代码
class Solution {
    /**
        start, end表示要存入的合并的区间起点&终点
        初始化为intervals[0] intervals[1]
        遍历intervals数组进行比较合并(intervals数组首先要对intervals[i][0]进行排序)

     */
    public int[][] merge(int[][] intervals) {
        // Arrays.sort(intervals, new Comparator<int[]>(){
        //     public int compare(int[] a, int[] b) {
        //         return Integer.compare(a[0], b[0]);
        //     }
        // });
        // Arrays.sort(intervals, (a, b) -> {
        //     return Integer.compare(a[0], b[0]);
        // });
        
        for(int i = 0; i < intervals.length - 1; i++) {
            for(int j = 0; j < intervals.length - 1 - i; j++) {
                if(intervals[j][0] > intervals[j + 1][0]) {
                    int[] temp = intervals[j];
                    intervals[j] = intervals[j + 1];
                    intervals[j + 1] = temp;
                }
            }
        }
        // for(int i = 0; i < intervals.length; i++) {
        //     System.out.println("interval数组的值" + intervals[i][0] + intervals[i][1]);
        // }

        List<List<Integer>> res = new ArrayList();
        int start = intervals[0][0];
        int end = intervals[0][1];
        for(int i = 1; i < intervals.length; i++) {
            // i = 1的【i】【0】比i = 0大,进行合并
            if(intervals[i][0] <= end) {
                end = Math.max(end, intervals[i][1]);
            }
            else {
                List<Integer> path = new ArrayList();
                path.add(start);
                path.add(end);
                res.add(path);
                start = intervals[i][0];
                end = intervals[i][1];
            }
        }
        List<Integer> path = new ArrayList();
        path.add(start);
        path.add(end);
        res.add(path);
        // System.out.println(res.size());
        int[][] ans = new int[res.size()][2];
        for(int i = 0; i < res.size(); i++) {
            ans[i][0] = res.get(i).get(0);
            ans[i][1] = res.get(i).get(1);
        }
        return ans;
    }
}

轮转数组

java 复制代码
class Solution {
    /**
        循环从队尾拿
        然后插入队头
        使用双端队列linkedlist
        然后发现函数返回void,说明应该要直接在nums基础上改动
     */
    public void rotate(int[] nums, int k) {
        int len = nums.length;
        int[] nums1 = new int[len];
        for(int i = 0; i < len; i++) {
            nums1[i] = nums[i];
        }
        for(int i = 0; i < len; i++) {
            nums[(i + k)% len] = nums1[i];
        }
    }
}

除自身以外数组的乘积

java 复制代码
// 双端队列,超时

缺失的第一个正数

java 复制代码
class Solution {
    /**
        again双端队列?
        不要思维定势啊喂
        首先将nums中所有<0 & >n+1的全部设置为不可达的值n+1
        用res存
     */
    public int firstMissingPositive(int[] nums) {
        int n = nums.length;
        int[] res = new int[nums.length];
        for(int i = 0; i < nums.length; i++) {
            if(nums[i] <= 0 || nums[i] > n) {
                nums[i] = n + 1;
            }
        }
        for(int i = 0; i < n; i++) {
            if(nums[i] != n + 1) {
               res[nums[i] - 1] = nums[i]; 
            }
        }
        for(int i = 0; i < res.length; i++) {
            // System.out.print("第" + i + "个数为" + res[i]);
            if(res[i] != i + 1) {
                return i + 1;
            }
        }
        return n + 1;
    }
}

矩阵

矩阵置0

java 复制代码
相关推荐
Daniel 大东44 分钟前
BugJson因为json格式问题OOM怎么办
java·安全
Theodore_10225 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸6 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象6 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了7 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·7 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic7 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王7 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康7 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神8 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式