算法修炼Day58|● 739. 每日温度 ● 496.下一个更大元素 I

简介: 算法修炼Day58|● 739. 每日温度 ● 496.下一个更大元素 I

LeetCode:739. 每日温度

739. 每日温度 - 力扣(LeetCode)

1.思路

自定义一个栈空间存储数组索引,将大于当前索引的数值时,计算索引差值,栈顶元素弹出,循环此步骤,直到:小于等于当前索引数值时,将当前索引加入栈中。

2.代码实现

// 超时
// 暴力解法:两层for循环,一层定义起始位置,一层定义终止位置。终止的情况有两种:一个是遇到大于当前节点的值,一个遍历到结尾没有遇到大于当前节点的值,使用一个局部变量和一个标识符标记即可
class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int[] answer = new int[temperatures.length];
        for (int i = 0; i < temperatures.length; i++) {
            int res = 0;
            boolean flag = false;
            for (int j = i; j < temperatures.length; j++) {
                if (temperatures[j] > temperatures[i]) {
                    answer[i] = res;
                    flag = true;
                    break;
                }
                res++;
            }
            if (!flag) {
                answer[i] = 0;
            }
        }
        return answer;
    }
}
// 单调栈
class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        Stack<Integer> stack = new Stack<>(); // 存储数组索引
        stack.push(0);
        int[] res = new int[temperatures.length];
        for (int i = 1; i < temperatures.length; i++) {
            if (temperatures[i] <= temperatures[stack.peek()]) {
                stack.push(i);
            } else {
                while (!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]) {
                    res[stack.peek()] = i - stack.peek();
                    stack.pop();
                }
                stack.push(i); // 如果符合单调递增,则加入栈
            }
        }
        return res;
    }
}

3.复杂度分析

时间复杂度:O(n).

空间复杂度:O(n).

LeetCode:496.下一个更大元素 I

496. 下一个更大元素 I - 力扣(LeetCode)

1.思路

将数组1中的元素映射到map中,对数组2进行遍历构造单调栈,当前元素小于栈顶元素时,入栈即可。当前元素大于栈顶元素时进行判断栈顶元素是否存在map中,对其进行循环判断,如果存在则将当前元素加入到和数组1值相同的索引下的结果集中。

2.代码实现

// 单调栈
class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        Stack<Integer> stack = new Stack<>();
        int[] res = new int[nums1.length];
        Arrays.fill(res, -1);
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums1.length; i++) {
            map.put(nums1[i], i);
        }
        stack.add(0);
        for (int i = 1; i < nums2.length; i++) {
            if (nums2[i] <= stack.peek()) {
                stack.add(i);
            } else {
                while (!stack.isEmpty() && nums2[i] > nums2[stack.peek()]) {
                    if (map.containsKey(nums2[stack.peek()])) {
                        int idx = map.get(nums2[stack.peek()]);
                        res[idx] = nums2[i]; 
                    }
                    // stack.pop();
                }
                stack.add(i);
            }
        }
        return res;
    }
}
// 暴力解法:ac
class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int[] res = new int[nums1.length];
        for (int i = 0; i < nums1.length; i++) {
            res[i] = -1;
        }
        for (int i = 0; i < nums1.length; i++) {
            for (int j = 0; j < nums2.length; j++) {
                if (nums1[i] == nums2[j]) {
                    for (int k = j + 1; k < nums2.length; k++) {
                        if (nums2[k] > nums2[j]) {
                            res[i] = nums2[k];
                            break;
                        }
                    }
                    break;
                }
            }
        }
        return res;
    }
}

3.复杂度分析

时间复杂度:O(n^2).

空间复杂度:O(n).

相关文章
|
6天前
|
算法 Java
[Java·算法·简单] LeetCode 27. 移除元素 详细解读
[Java·算法·简单] LeetCode 27. 移除元素 详细解读
27 1
|
6天前
|
存储 算法
代码随想录算法训练营第五十九天 | LeetCode 739. 每日温度、496. 下一个更大元素 I
代码随想录算法训练营第五十九天 | LeetCode 739. 每日温度、496. 下一个更大元素 I
23 1
|
6天前
|
算法
代码随想录算法训练营第五十七天 | LeetCode 739. 每日温度、496. 下一个更大元素 I
代码随想录算法训练营第五十七天 | LeetCode 739. 每日温度、496. 下一个更大元素 I
18 3
|
6天前
|
算法 测试技术 Serverless
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
|
6天前
|
算法
常见算法题——203.移除链表元素
【2月更文挑战第9天】
26 0
|
6天前
|
搜索推荐 算法
在冒泡排序算法中,为什么每次比较相邻的元素时都要进行交换?
【2月更文挑战第8天】【2月更文挑战第21篇】在冒泡排序算法中,为什么每次比较相邻的元素时都要进行交换?
|
6天前
|
算法
|
6天前
|
搜索推荐 算法 测试技术
【排序算法】【二叉树】【滑动窗口】LeetCode220: 存在重复元素 III
【排序算法】【二叉树】【滑动窗口】LeetCode220: 存在重复元素 III
|
6天前
|
存储 算法
算法题解-二叉搜索树中第K小的元素
算法题解-二叉搜索树中第K小的元素
|
6天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。