1
2
3
4
5
6
<code>Given a circular array (the next element of the last element is the first element of the array), print the Next Greater Number for every element. The Next Greater Number of a number x is the first greater number to its traversing-order next in the array, which means you could search circularly to find its next greater number. If it doesn't exist, output -1 for this number.</code>
<code>Example 1:</code>
<code>Input: [1,2,1]Output: [2,-1,2]Explanation: The first 1's next greater number is 2; </code>
<code>The number 2 can't find next greater number; </code>
<code>The second 1's next greater number needs to search circularly, which is also 2.</code>
<code>Note: The length of given array won't exceed 10000.</code>
題意:給一個循環數組,求解其next greater number:第一個比其大的數。
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<code>public</code> <code>class</code> <code>Solution {</code>
<code> </code><code>////這個思路是直接double數組,把原來的循環簡化了。貌似還有用棧的。再看看。</code>
<code> </code><code>public</code> <code>int</code><code>[] nextGreaterElements(</code><code>int</code><code>[] nums) {</code>
<code> </code><code>if</code><code>(nums.length==</code><code>1</code><code>){</code>
<code> </code><code>nums[</code><code>0</code><code>]=-</code><code>1</code><code>;</code>
<code> </code><code>return</code> <code>nums;</code>
<code> </code><code>}</code>
<code> </code><code>int</code><code>[] newnums=</code><code>new</code> <code>int</code><code>[nums.length*</code><code>2</code><code>];</code>
<code> </code><code>for</code><code>(</code><code>int</code> <code>i=</code><code>0</code><code>;i<newnums.length;i++){</code>
<code> </code><code>newnums[i]=nums[i%nums.length];</code>
<code> </code><code>// for(int i=0;i<nums.length;i++){</code>
<code> </code><code>// newnums[i]=nums[i];</code>
<code> </code><code>// }</code>
<code> </code><code>// int index=0;</code>
<code> </code><code>// for(int i=nums.length;i<newnums.length;i++){</code>
<code> </code><code>// newnums[i]=nums[index++];</code>
<code> </code><code>// for(int i=0;i<nums.length*2;i++){</code>
<code> </code><code>// System.out.println(newnums[i]+" ");</code>
<code> </code><code>for</code><code>(</code><code>int</code> <code>i=</code><code>0</code><code>;i<nums.length;i++)</code>
<code> </code><code>for</code><code>(</code><code>int</code> <code>j=i+</code><code>1</code><code>;j<i+nums.length;j++)</code>
<code> </code><code>if</code><code>(newnums[j]>newnums[i]){</code>
<code> </code><code>nums[i]=newnums[j];</code>
<code> </code><code>break</code><code>;</code>
<code> </code><code>}</code><code>else</code><code>{</code>
<code> </code><code>nums[i]=-</code><code>1</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>return</code> <code>nums;</code>
<code> </code><code>}</code>
<code>}</code>
PS:聽群裡大神說把數組直接double一下,然後就可以簡化了,【好厲害】。然後就是暴力搜尋了。。。。。。。。貌似還有棧!
棧的話,若目前元素小于等于棧頂元素,直接入棧。若大于棧頂元素,即将所有小于該元素的值出站,并作為=他們的next greater number。再來一次循環,隻出棧,看看能不能找到比他大的元素。最後看看棧裡的元素就是最大值,直接設為-1
本文轉自 努力的C 51CTO部落格,原文連結:http://blog.51cto.com/fulin0532/1901699