zoukankan      html  css  js  c++  java
  • 324. Wiggle Sort II

    这个题真是做得我想打人了。我生起气来连自己都打。
    image

    一开始quick select没啥可说的。但是in place把老命拼了都没想出来。。

    看网上的答案是3 partition,MAP式子一看就由衷地反胃。。

    老子不管了,就O(n)。。

    public class Solution 
    {
        public void wiggleSort(int[] nums) 
        {
            if(nums.length <= 1 ) return;
            if(nums.length == 2)
            {
                if(nums[0] > nums[1]) swap(0,1,nums);
                return;
            }
            
            //start of larger half
            int m = (nums.length+1)/2;
            
            
            
            int mVal = nums[quickSelect(nums,m,0,nums.length-1)];
            
            
            int[] res = new int[nums.length];
            
            int a = 0, b = nums.length-1;
            for(int i = 0; i < res.length;i++)
            {
                if(nums[i] < mVal)
                {
                    res[a] = nums[i];
                    a++;
                }
                else if(nums[i] > mVal)
                {
                    res[b] = nums[i];
                    b--;
                }
                
            }
    
            while(a < m) res[a++] = mVal;
            while(b >= m) res[b--] = mVal;
            //System.out.println(a + " " + b + " " + m + " " + mVal);
            b = nums.length-1;
            a-=1;
            for(int i = 0; i < nums.length;i++)
            {
                
                if(i%2 == 0) 
                {
                    nums[i] = res[a];
                    a--;
                    
                }
                else
                {
                    nums[i] = res[b];
                    b--;
                    
                }
            }
            
            return;
            
            
            
        }
        
        public int quickSelect(int[] nums, int m, int L, int R)
        {
            int pIndex = awesomePick(L,R,nums);
            int pVal = nums[pIndex];
            
            
            swap(R,pIndex,nums);
            int tempIndex = L;
            for(int i = L; i < R;i++)
            {
                if(nums[i] <= pVal) swap(i,tempIndex++,nums);
            }
            swap(tempIndex,R,nums);
            
            if(tempIndex == m) return tempIndex;
            else if(tempIndex < m) return quickSelect(nums,m,tempIndex+1,R);
            else return quickSelect(nums,m,L,tempIndex-1);
            
            
        }
        
        public void swap(int a, int b, int[] nums)
        {
            int temp = nums[a];
            nums[a] = nums[b];
            nums[b] = temp;
        }
        
        public int awesomePick(int L, int R, int[] nums)
        {
            int a = nums[L];
            int b = nums[R];
            int M = L+(R-L)/2;
            int c = nums[M];
            
            if( a > b )
            {
                if( b > c ) return R;
                else if(a > c) return M;
                else return L;
                
            }
            //b > a
            else
            {
                if(a > c) return L;
                else if(b > c) return M;
                else return R;
            }
        }
    }
    
  • 相关阅读:
    apache 页面压缩技术mod_deflate安装和配置
    获取指定目录下的所有文件名和路径(包括子目录)
    ThinkPHP框架项目开发专题自动验证
    hd cdnServer 51cdn / ChinaCache / ATS / Apache Traffic Server
    js calendar / wannianli
    OS + Unix Solaris / openSolaris
    project web architecture
    OS + Unix HPUX
    逻辑左移
    桂林游览2
  • 原文地址:https://www.cnblogs.com/reboot329/p/5874339.html
Copyright © 2011-2022 走看看