zoukankan      html  css  js  c++  java
  • 找出数组中右边比我小的元素

    【题目】一个整数数组A,找到每个元素:右边第一个比我小的下标位置,没有则用-1表示

    输入:[5,2]

    输出:[1,-1]

    解释:因为元素5的右边离我最近且比我小的位置应该A[1],最后一个元素2右边没有比2小的元素,所以应该输出-1

    package leetcode;
    
    import java.util.HashMap;
    import java.util.Stack;
    
    public class FindRSmallSolution {
        int[] findRightSmall(int[] A){
            //结果数组
            int[] ans = new int[A.length];
    
            //注意,栈中元素记录的是下标
            Stack<Integer> t = new Stack();
            for(int i = 0 ; i< A.length ;i++){
                final int x = A[i];
                //每个元素都向左遍历栈中的元素完成消除动作
                while(!t.empty() && A[t.peek()] > x){
                    //x消除的时候,记录一下被谁消除了
                    ans[t.peek()] =i ;
                    //消除的时候,值更大的需要从栈中消失
                    t.pop();
                }
                //剩下的入栈
                t.push(i);
            }
            //栈中剩下的元素,由于没有人能消除他们,因此,只能将结果数组为-1
            while(!t.empty()){
                ans[t.peek() ]= -1;
                t.pop();
            }
            return ans;
        }
        int[] findRightSmall2(int[] arr){
            int[] res = new int[arr.length];
            if(arr.length == 1){
                res[arr.length-1] = -1;
                return  res;
            }
            for(int i= 0 ;i <arr.length ;i++){
                int flag =-1;
                for(int j=i+1 ;j < arr.length; j++){
                    if(arr[i] > arr[j]){
                        flag= 1;
                        res[i]=j;
                        break;
                    }
                }
                if(flag !=1){
                    res[i] =-1;
                }
            }
            return res;
        }
        public static void main(String[] args){
            FindRSmallSolution fs = new FindRSmallSolution();
            int[] arr= {1,2,4,9,4,0,5};
             int[] f =fs.findRightSmall2(arr);
             int[] e = fs.findRightSmall(arr);
            for(int h=0; h< f.length;h++){
                System.out.println(f[h]);
            }
            System.out.println("===========================");
            for(int n=0; n< f.length;n++){
                System.out.println(e[n]);
            }
        }
    }
  • 相关阅读:
    H264码流解析及NALU
    pflua:用Lua编写的高性能网络包过滤工具箱
    最新版FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用简介
    JNI和NDK的区别
    按两次回退键退出系统
    在当前界面停留几秒然后跳到另一个界面
    解决ScrollView 与ListView共存显示不完全的问题
    设置ListView每条数据之间的间隔
    通过布局文件来显示ListView内容并注册 ListView事件
    Android 改变标题栏的背景色
  • 原文地址:https://www.cnblogs.com/goodtest2018/p/14855853.html
Copyright © 2011-2022 走看看