LeetCode-496-下一个更大元素 I-编程思维

下一个更大元素 I

题目描述:给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。

请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。

nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。

示例说明请见LeetCode官网。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-greater-element-i/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:暴力破解法

首先,声明一个大小和nums一样的数组用来存放结果,然后遍历nums1中的元素:

  • 声明2个boolean变量,equals表示是否找到nums2中于当前nums位置的值相等的元素;
  • found表示是否找到在 nums2 中对应位置的右边的第一个比 x 大的元素;
  • 内层循环遍历nums2中的元素,找到和nums1当前位置相同的元素,然后判断其后面是否存在比之更大的元素,如果没有找到,将结果集中相应位置的元素置为-1。

最后,返回结果集。

public class LeetCode_496 {
    /**
     * 暴力破解法
     *
     * @param nums1
     * @param nums2
     * @return
     */
    public static int[] nextGreaterElement(int[] nums1, int[] nums2) {
        // 结果集
        int[] result = new int[nums1.length];
        // 遍历nums1中的元素
        for (int i = 0; i < nums1.length; i++) {
            // equals表示是否找到nums2中于当前nums位置的值相等的元素
            // found表示是否找到在 nums2 中对应位置的右边的第一个比 x 大的元素
            boolean equals = false, found = false;
            for (int j = 0; j < nums2.length; j++) {
                if (equals) {
                    if (nums2[j] > nums1[i]) {
                        found = true;
                        result[i] = nums2[j];
                        break;
                    }
                } else {
                    if (nums2[j] == nums1[i]) {
                        equals = true;
                    }
                }
            }
            // 最后,如果么找到,则将当前位置的值置为-1
            if (!found) {
                result[i] = -1;
            }
        }

        return result;
    }

    public static void main(String[] args) {
        int[] num1 = {4, 1, 2};
        int[] num2 = {1, 3, 4, 2};
        // 测试用例,期望输出: -1,3,-1
        for (int i : nextGreaterElement(num1, num2)) {
            System.out.print(i + ",");
        }
    }
}

【每日寄语】 舍弃有限,赢得无限。

版权声明:本文版权归作者所有,遵循 CC 4.0 BY-SA 许可协议, 转载请注明原文链接
https://www.cnblogs.com/kaesar/p/16207178.html

让微信能给你设备发送文件消息-微信硬件平台(1)-编程思维

背景 此篇文章你能获得:了解如何通过微信给自己设备发送文件(充当文件助手)或者链接(充当分享好文快捷入口)等功能; 业务情况 随着用户对 学习机(自研的设备) 不断使用,我们在埋点数据各核心功能使用统计中发现微信的使用率稳居第一,据调研用户主要使用微信上网课、接收文件等。 目标 手机给我们自己的设备传输文件 这

SpringBoot全局线程池-编程思维

前言 我们在做WS服务器的时候,如果我们在接收消息的方法中对所有用户群发消息的时候,如果不用线程池发送,那么就相当于在该线程中串行的发送消息,如果用户较多,就会占用大量时间,这时就需要使用线程池。 但是直接使用线程池的话,如果同时有3个连接,我们创建的线程池的线程数量是5,那么在使用中就会占用15个线程,这就十分恐怖,

Halo 开源项目学习(七):缓存机制-编程思维

基本介绍 我们知道,频繁操作数据库会降低服务器的系统性能,因此通常需要将频繁访问、更新的数据存入到缓存。Halo 项目也引入了缓存机制,且设置了多种实现方式,如自定义缓存、Redis、LevelDB 等,下面我们分析一下缓存机制的实现过程。 自定义缓存 1. 缓存的配置 由于数据在缓存中以键值对的形式存在,且不同类型的

Java的Lambda表达式-编程思维

函数式编程(Functional Programming)是把函数作为基本运算单元,函数可以作为变量,可以接收函数,还可以返回函数。历史上研究函数式编程的理论是Lambda演算,所以我们经常把支持函数式编程的编码风格称为Lambda表达式。 在Java程序中,我们经常遇到一大堆单方法接口,即一个接口只定义了一个方法:

Set-编程思维

供自己巩固集合知识时写的笔记,不会对所有的内容都介绍 我们知道,Map用于存储key-value的映射,对于充当key的对象,是不能重复的,并且,不但需要正确覆写equals()方法,还要正确覆写hashCode()方法。 如果我们只需要存储不重复的key,并不需要存储映射的value,那么就可以使用Set。 Set

Stack-编程思维

供自己巩固集合知识时写的笔记,不会对所有的内容都介绍 栈(Stack)是一种后进先出(LIFO:Last In First Out)的数据结构 Stack只有入栈和出栈的操作: 把元素压栈:push(E); 把栈顶的元素“弹出”:pop(); 取栈顶元素但不弹出:peek()。 有的人在使用Stack时会发现,Sta

算法分析——时间复杂度-编程思维

时间复杂度 定义&意义 一行代码运行的时间*该行运行次数(对所有行执行次运算) 描述一个算法的快慢性能(假设在同样算力的计算机上,且没有其他任务消耗计算机任务的理想情况下) 标识 约定用T(N) 表示所有主要语句的运行时间 ,单位时间为单位 将T(N)近似后用O(f(N)) 表示,其中,f(N) ~ F(N)

Leetcode 2题 两数相加-编程思维

题目链接 https://leetcode-cn.com/problems/add-two-numbers/ 题目描述 给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字0之外,这两个数都

【算法day1】复杂度和简单排序算法(1)-编程思维

时间复杂度 以一个排序(选择排序)操作举例 假设我有一个数组,我要找出其中的最小值放到0的位置上 那么 第一次我会遍历数组中N个数(在0位置处),找出最小的数交换到0位置【看了(寻址)N次,比较N次,一次交换】 第二次我会看我会遍历数组中N-1个数(在1位置处),找出最小的数交换到1位置【看了(寻址)N-1次,比较N