每日一题556. 下一个更大元素 III

Posted 王六六的IT日常

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题556. 下一个更大元素 III相关的知识,希望对你有一定的参考价值。

556. 下一个更大元素 III
中等题

简单构造模拟题.

  • 先对 x 的每一位取出,存成 nums 数组(数组的首位元素为原数 x 的最低位)
  • 尝试找到第一个能够交换的位置 idx(若无法找到,说明不存在合法值,返回 −1)
    • 从 nums[0](原始 x 的最低位)开始找,找到第一个「降序」的位置 idx
    • 然后从 [0,idx) 范围内找一个比 nums[idx] 要大的最小数与其进行互换
    • 既从 nums[0] 开始找,找到第一个满足比 nums[idx] 大的数。
  • 当互换完成后,此时比 x 要大这一目标已由第 idx 位所保证(后续的排序应该按照从小到大放置),同时互换结束后的 [0,idx) 仍然满足「非严格升序」特性,可以对其运用「双指针」进行翻转
class Solution 
    public int nextGreaterElement(int x) 
        List<Integer> nums = new ArrayList<>();
        //取出x的每一位
        while (x != 0) 
            nums.add(x % 10);
            x /= 10;
        
        int n = nums.size(), idx = -1;
        for (int i = 0; i < n - 1 && idx == -1; i++) 
            if (nums.get(i + 1) < nums.get(i)) 
                idx = i + 1;
            
        
        if (idx == -1) return -1;
        for (int i = 0; i < idx; i++) 
            if (nums.get(i) > nums.get(idx)) 
                swap(nums, i, idx);
                break;
            
        
        for (int l = 0, r = idx - 1; l < r; l++, r--) 
            swap(nums, l, r);
        
        long ans = 0;
        for (int i = n - 1; i >= 0; i--) 
            ans = ans * 10 + nums.get(i);
        
        return ans > Integer.MAX_VALUE ? -1 : (int)ans;
    
    //交换函数
    public void swap(List<Integer> nums, int a, int b) 
        int c = nums.get(a);
        nums.set(a, nums.get(b));
        nums.set(b, c);
    

class Solution 
    public int nextGreaterElement(int n) 
        List<Integer> list = new ArrayList<>();
        //取出n的每一位
        while (n > 0) 
            list.add(n % 10);
            n /= 10;
        
        boolean flag = true;
        for (int i = 1; i < list.size(); i++) 
            //找到第一个高位数字小于低位数字的位置,此时[0, 高位数字)为升序
            if (list.get(i - 1) > list.get(i)) 
                //从低位向高位遍历,找到第一个大于高位的数字,交换位置
                for (int j = 0; j < i; j++) 
                    if (list.get(j) > list.get(i)) 
                        swap(list, j, i);
                        break;
                    
                
                //此时[0, 高位)为升序,翻转此区间,并修改标记
                for (int lo = 0, hi = i - 1; lo < hi; lo++, hi--) 
                    swap(list, lo, hi);
                
                flag = false;
                break;
            
        
        //上轮循环未找到符合要求的数字,则n没有满足题意的数字,返回-1
        if (flag) 
            return -1;
        
        long sum = 0;
        //结果大于2^31 - 1,返回 -1
        for (int i = list.size() - 1; i >= 0; i--) 
            sum = sum * 10 + list.get(i);
            if (sum > Integer.MAX_VALUE) 
                return -1;
            
        
        return (int) sum;
    
    //交换链表中的元素
    void swap(List<Integer> list, int lo, int hi) 
        int tmp = list.get(lo);
        list.set(lo, list.get(hi));
        list.set(hi, tmp);
    

以上是关于每日一题556. 下一个更大元素 III的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 556. 下一个更大元素 III(Next Greater Element III)

556. 下一个更大元素 III

Leetcode 556.下一个更大元素III

字符串556. 下一个更大元素 III

556. 下一个更大元素 III-(31. 下一个排列)-两次遍历

556. 下一个更大元素 III-(31. 下一个排列)-两次遍历