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

算法回顾1

class Solution {
    public int removeElement(int[] nums, int val) {
        int fast = 0;
        int slow = 0;
        for (fast = 0; fast < nums.length; fast++) {
            if (nums[fast] != val) {
                nums[slow] = nums[fast];
                slow++;
            }
        }
        return slow;
    }
}

用双指针写这道题,快慢指针初始值都为0,如果快指针所对应的值!=val,就把快指针对应的值赋值给慢指针,慢指针++,相等的话,不做操作,但是当遇到下一个不等的值时,不等处的值会覆盖相等处的值,最后,只需要return slow就会得到k的值了。

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int i = 0;
        int sum = 0;
        int subl = Integer.MAX_VALUE;
        int result =Integer.MAX_VALUE;
        for (int j = 0; j < nums.length; j++) { //j为终止位置
            sum += nums[j];
            while (sum >= target) {
                subl = j - i + 1;
                result = Math.min(subl, result);
                sum = sum - nums[i];
                i++;
            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }
}

这道题用滑动窗口的思想来写,也可以说是移动的双指针。遍历,让j表示终止位置,i表示起始位置sum+=nums[j],用while循环判断,当sum>target的时候,记录当前子数组的长度subl,和result相比取小值,这时,在缩减长度,sum-=nums[i],i++,如果sum仍然大于目标值target,则更新result,否则,跳出while循环,最后,返回result。

class Solution {
    public int[][] generateMatrix(int n) {
        int start_x = 0;
        int start_y = 0;
        int loop = n / 2; // 循环次数
        int[][] nums = new int[n][n];
        int k = 1; // 计数器
        int offset = 1; // 每次循环后需要增加的偏移量

        while (loop > 0) {
            int i = start_y;
            int j = start_x;
            // 上边:从左到右遍历
            for (; j < start_x + n - offset; j++) {
                nums[start_x][j] = k++;
            }
            // 右边:从上到下遍历
            for (; i < start_y + n - offset; i++) {
                nums[i][j] = k++;
            }
            // 下边:从右到左遍历
            for (; j > start_y; j--) {
                nums[i][j] = k++;
            }
            // 左边:从下到上遍历
            for (; i > start_x; i--) {
                nums[i][j] = k++;
            }

            // 更新起始点和偏移量
            start_x++;
            start_y++;
            offset += 2;
            loop--;
        }

        // 如果n为奇数,填入中心元素
        if (n % 2 == 1) {
            nums[start_x][start_y] = k;
        }

        return nums;
    }
}

遵循循环不变量的原则来写这道题,这里的不变量指的时每条边的处理规则,用左闭右开。n*n正方形,则他要循环的此时为n/2次,offset代表的时偏移量。

class Solution {
      public ListNode reverseBetween(ListNode head, int left, int right) {
        if (head == null || head.next == null || left == right)
            return head;
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode pre = dummy;
//将pre移动到left的前一个位置
        for (int i = 0; i < left - 1; i++) {
            pre = pre.next;
        }
        ListNode curr = pre.next;
        ListNode thenext = null;
        //反转left到right之间的节点
        for (int i = left; i < right; i++) {
            thenext = curr.next;
            curr.next = thenext.next;
            thenext.next = pre.next;
            pre.next = thenext;
        }
        return dummy.next;
    }
}

相关文章:

  • H5--开发适配
  • TLV解码
  • 多层次自治协作智能网络
  • Ubuntu20.04之VNC的安装使用与常见问题
  • Vue3 + vite 打包后查看资源占比
  • 单片机裸机编程:状态机与其他高效编程框架
  • 神经网络八股(3)
  • 从工程师到系统架构设计师
  • 华为OD机试真题:最左侧冗余覆盖子串(E卷、C++)
  • Kafka面试题汇总
  • 大模型面试基础问题
  • Open WebUI本地部署教程
  • 创建索引时,ES,分片和副本定义原则
  • w228高校教师电子名片系统的设计与实现
  • 我写了一个程序:禁止用户Drop数据库 | 禁止Drop database包括用户自身建的库也无权限删除
  • 2025年SCI一区智能优化算法:混沌进化优化算法(Chaotic Evolution Optimization, CEO),提供MATLAB代码
  • 2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题6)-网络部分解析-附详细代码
  • 在 WPF 项目中集成 Hangfire
  • 使用AWS服务Amazon Bedrock构建大模型应用
  • CSS 使用white-space属性换行
  • wordpress oss/seo综合查询站长工具怎么用
  • 西樵网站建设公司/电脑培训机构
  • 昆钢建设集团网站/成都seo培训
  • 网站系统下载不了文件/seo还有前景吗
  • 亚马逊雨林是怎么形成的/多少关键词排名优化软件
  • 你下水好多下水道bd/seo岗位工作内容