【leetcode】杨辉三角 、移除元素(Java语言描述)

news2024/11/25 1:06:33

杨辉三角

给定一个非负整数 numRows生成「杨辉三角」的前 numRows 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

示例 1:

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

示例 2:

输入: numRows = 1
输出: [[1]]

解题思路

杨辉三角(Pascal's Triangle)是一个由数字排列成的三角形,每个数字等于其上方两个数字之和。下面是两种方案的解题思路及对应的Java代码。

解题思路

  1. 使用二维数组

    • 创建一个二维数组来存储杨辉三角的每一行。
    • 第一行和第二行的元素为1。
    • 从第三行开始,每个元素为其上方两个元素的和。
    • 逐行填充数组,直到达到所需的行数。
  2. 使用顺序表(ArrayList)

    • 使用ArrayList来存储每一行的内容。
    • 每一行创建一个新的ArrayList,第一列和最后一列为1。
    • 中间的元素则由前一行的两个上方元素相加得出。
    • 最终将每一行的ArrayList添加到一个大的ArrayList中。

方案一:使用二维数组

public class PascalTriangle {
    public int[][] generate(int numRows) {
        int[][] triangle = new int[numRows][];
        
        for (int i = 0; i < numRows; i++) {
            triangle[i] = new int[i + 1]; // 每行的长度
            triangle[i][0] = 1; // 第一列赋值为1
            triangle[i][i] = 1; // 最后一列赋值为1
            
            for (int j = 1; j < i; j++) {
                triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j];
            }
        }
        
        return triangle;
    }

    public static void main(String[] args) {
        PascalTriangle pt = new PascalTriangle();
        int[][] result = pt.generate(5); // 生成前5行的杨辉三角
        for (int[] row : result) {
            for (int num : row) {
                System.out.print(num + " ");
            }
            System.out.println();
        }
    }
}

方案二:使用顺序表(ArrayList)

import java.util.ArrayList;
import java.util.List;

public class PascalTriangle {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> triangle = new ArrayList<>();
        
        for (int i = 0; i < numRows; i++) {
            List<Integer> row = new ArrayList<>();
            row.add(1); // 第一列赋值为1
            
            if (i > 0) {
                List<Integer> prevRow = triangle.get(i - 1);
                for (int j = 1; j < i; j++) {
                    // 中间的元素
                    row.add(prevRow.get(j - 1) + prevRow.get(j));
                }
                row.add(1); // 最后一列赋值为1
            }
            
            triangle.add(row);
        }
        
        return triangle;
    }

    public static void main(String[] args) {
        PascalTriangle pt = new PascalTriangle();
        List<List<Integer>> result = pt.generate(5); // 生成前5行的杨辉三角
        for (List<Integer> row : result) {
            for (int num : row) {
                System.out.print(num + " ");
            }
            System.out.println();
        }
    }
}

总结

两种方案都能够有效地生成杨辉三角,使用二维数组的方式在内存上相对更高效,而使用ArrayList的方法更加灵活,适合需要动态调整大小情况下的存储需求。根据实际情况选择合适的方案。

移除元素

题目描述

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
  • 返回 k

解题思路

在处理“移除元素”的问题时,我们可以采用两种常见解法。下面将用文字解析并提供 Java 代码实现这两种方案。

解法一:双指针法

这种方法使用两个指针,其中一个指针遍历数组,另一个指针用于记录不等于 val 的元素的插入位置。遍历数组的过程中,当我们遇到不等于 val 的元素时,就把它放到有效数组的位置。

代码实现:

public class Solution {
    public int removeElement(int[] nums, int val) {
        int k = 0; // k表示不等于val的元素数量
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != val) {
                nums[k] = nums[i]; // 将不等于val的元素移动到前面
                k++; // 不等于val的元素计数器加一
            }
        }
        return k; // 返回不等于val的元素个数
    }
}

解析:

  1. 初始化一个指针 k 为 0,用于记录不等于 val 的元素个数。
  2. 使用一个循环遍历数组中的每个元素,当遇到不等于 val 的元素时,将其存入 nums[k],然后 k 加一。
  3. 最终,k 就是数组中不等于 val 的元素数量。

解法二:覆盖法

这种方法也是通过一个指针遍历数组,但在遍历的过程中,如果元素等于 val,就继续向后查找,找到不等于 val 的元素后进行覆盖。

代码实现:

public class Solution {
    public int removeElement(int[] nums, int val) {
        int n = nums.length;
        for (int i = 0; i < n; i++) {
            if (nums[i] == val) {
                // 如果当前元素是val,就从后面开始找
                while (n - 1 > i && nums[n - 1] == val) {
                    n--; // 缩短数组长度
                }
                if (n - 1 > i) {
                    nums[i] = nums[n - 1]; // 将后面的不等于val的元素移到当前位置
                    n--; // 缩短数组长度
                }
            }
        }
        return n; // n即为不等于val的元素个数
    }
}

解析:

  1. 使用 n 记录当前数组长度,通过循环遍历每个元素。
  2. 当遇到等于 val 的元素时,使用一个内部的 while 循环从后往前查找,找到不等于 val 的元素来进行覆盖。
  3. 每次完成覆盖后,n 减少表示当前数组长度减少,最终返回的 n 即为不等于 val 的元素数量。

总结

这两种解法都能有效地实现需求,使用不同的指针策略,可以根据具体情况选择实现。双指针法相对简洁直观,而覆盖法在某些情况下可能更高效。此题所采用的数组原地操作符合要求,元素顺序可被打乱,这是其允许的特性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2033323.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SecureCoding in C and C++(二)

经过上期的环境搭建过后&#xff0c;我们将正式的学习C系列&#xff0c;首先要学习的是C的一些常用的变量 从编译和连接学起似乎也是不错的选择。 个人总结的一句话&#xff1a;编译其实就是对预处理语句进行处理后&#xff0c;然后对语句进行处理。对预处理语句&#xff0c;例…

C++——list列表容器经典案例——手机按销量降序排列,若销量相同则按价格降序排列

需求&#xff1a;使用list列表对商品进行排序&#xff0c;先通过销量降序排&#xff0c;若销量相同则根据价格升序排列输出 涉及到的知识点&#xff1a;list列表容器、自定义数据类型、自定义排序规则 实现步骤&#xff1a; 1&#xff0c;自定义数据类型Product&#xff0c;…

Android 实现多进程通讯(如何实现多进程开发,Binder、AIDL)

目录 1&#xff09;为什么App需要多进程 2&#xff09;什么是多进程开发? 3&#xff09;如何实现多进程开发&#xff1f; 4&#xff09;跨进程间通讯(案例) 5&#xff09;多进程需要注意什么问题&#xff1f; 6&#xff09;多进程的底层原理是什么&#xff1f;【待写】 …

【Python机器学习】树回归——使用Python的tkinter库创建GUI

机器学习给我们提供了一些强大的工具&#xff0c;能从未知数据中抽取出有用的信息。因此&#xff0c;能否这些信息以易于人们理解的方式呈现十分重要。如果人们可以直接与算法和数据交互&#xff0c;将可以比较轻松的进行解释。其中一个能够同时支持数据呈现和用户交互的方式就…

手机IP地址:是根据网络还是设备决定的?

在日益数字化的今天&#xff0c;手机已经成为我们日常生活中不可或缺的一部分。它不仅是我们沟通的桥梁&#xff0c;更是我们获取信息、享受娱乐和完成工作的得力助手。然而&#xff0c;在使用手机上网的过程中&#xff0c;你是否曾经好奇过手机的IP地址是如何被分配的&#xf…

Java中class文件结构分析二

第17个常量池:01 00 15 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56 01&#xff1a;tag位表示的是utf8类型的字面量常量 00 15 二个字节表示的是字面量常量的长度为21 接下来21个字节: 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56…

经典大语言模型解读(1):BERT——基于双向Transformer的预训练语言模型

论文&#xff1a;BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 前言 BERT&#xff08;Bidirectional Encoder Representation from Transformer&#xff09;是Google于2019年提出的预训练语言模型。与寻常的Transformer架构不同&#…

eval和长度限制

目录 源码 解决方案 方法一 方法二 方法三 源码 <?php $param $_REQUEST[param]; if(strlen($param)<17 && stripos($param,eval) false && stripos($param,assert) false) {eval($param); } ?> 限制条件&#xff1a; 传入的参数长度不能…

Go语言+Vue3开发前后端后台管理系统实战 用户管理的前端界面和表结构分析

首页&#xff1a; 用户管理界面&#xff1a; 到这一步以后来看一下后端代码的表结构是如何设计的&#xff1a; 后端代码中&#xff0c;使用的操作MySQL的技术是gorm&#xff1a; gorm.io/gorm v1.25.5其中&#xff0c;用户表的定义位置如下&#xff1a; 此时的完整代码如…

C++虚函数习题

#include <iostream>using namespace std;class Animal { public:Animal() {}virtual void perform()0; };class Lion:public Animal { public:Lion() {}void perform(){cout << "狮子会吃小朋友&#xff01;&#xff01;&#xff01;快跑&#xff01;&#x…

设计模式(1)创建型模式和结构型模式

1、目标 本文的主要目标是学习创建型模式和结构型模式&#xff0c;并分别代码实现每种设计模式 2、创建型模式 2.1 单例模式&#xff08;singleton&#xff09; 单例模式是创建一个对象保证只有这个类的唯一实例&#xff0c;单例模式分为饿汉式和懒汉式&#xff0c;饿汉式是…

IP问题总结

IP基础知识 IP 在 TCP/IP 参考模型中处于第三层&#xff0c;也就是⽹络层。 ⽹络层的主要作⽤是&#xff1a;实现主机与主机之间的通信&#xff0c;也叫点对点&#xff08;end to end&#xff09;通信。 1.⽹络层与数据链路层有什么关系呢&#xff1f; 其实很容易区分&#…

eNSP 华为浮动路由

R1&#xff1a; <Huawei>system-view [Huawei]sysname R1 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 172.16.1.1 24 [R1-GigabitEthernet0/0/0]int g0/0/1 [R1-GigabitEthernet0/0/1]ip add 10.10.1.1 24 [R1-GigabitEthernet0/0/1]quit [R1]vlan 10 //e口是…

使用docker搭建aria2-pro+ariang并在alist中配置

一、安装aria2-pro 1.创建映射目录 # 配置目录 mkdir -p /usr/local/docker/aria2/config # 下载目录 mkdir -p /share_root/download-aria22.创建容器 docker run -d \--name aria2-pro \--restart unless-stopped \--log-opt max-size1m \--network host \-e PUID$UID \-e …

【秋招笔试】8.12-4399秋招(第一套)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

全网最详细HAProxy入门小知识

目录 一. 负载均衡 负载均衡的意义&#xff1a; 负载均衡的类型&#xff1a; 二. HAProxy 简介 HAProxy 的特点&#xff1a; 社区版和企业版&#xff1a; 三. HAProxy 的安装和服务信息 1、实验环境 1&#xff09;安装并配置 Nginx 2&#xff09;在客户端测试 2、安装…

【项目实战】C++视频共享点播系统

目录 一、项目介绍 1.1 对视频共享点播系统的认识 1.2服务端程序负责功能 1.3 服务端功能模块划分 1.4 项目界面演示 1.5预备知识 二.环境搭建 2.1 安装 Jsoncpp 库 2.1.1 使用jsoncpp 2.2 引入httplib库 2.2.1 安装Git&#xff08;如果你的系统尚未安装Git&#xf…

基于Hadoop的共享单车分布式存储与计算

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍研究背景研究目的和意义国内外研究现状总体研究思路数据可视化每文一语 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 共享单车的普及带…

Elasticsearch:使用 ES|QL 进行地理空间搜索

作者&#xff1a;来自 Elastic Craig Taverner 多年来&#xff0c;Elasticsearch 一直具有强大的地理空间搜索和分析功能&#xff0c;但其 API 与典型的 GIS 用户习惯的 API 截然不同。在过去的一年中&#xff0c;我们添加了 ES|QL 查询语言&#xff0c;这是一种管道查询语言&a…

React原理之React整体渲染流程

前置知识&#xff1a;深度优先搜索(DFS)、Fiber 节点 在上一篇 React原理篇之 React 整体架构解读中&#xff0c;提到了 Fiber 架构中的几个核心概念&#xff1a; Scheduler&#xff08;调度器&#xff09;&#xff1a;根据任务的优先级安排任务执行顺序。Reconciler&#xff…