宣告:題目來自:http://blog.csdn.net/v_july_v/archive/2010/11/17/6015165.aspxhttp://blog.csdn.net/v_july_v/archive/2011/01/10/6126406.aspx自己先做一遍。
題目:
初看此題,貌似很難,10分鐘過去了,可能有的人,題目都還沒看懂。
舉乙個例子,
數值: 0,1,2,3,4,5,6,7,8,9
分配: 6,2,1,0,0,0,1,0,0,0
0在下排出現了6次,1在下排出現了2次,
2在下排出現了1次,3在下排出現了0次....
以此類推..
思路:
說實話,第一遍看題目我還真沒有看懂,看了下面的例子我才看懂的。brute-force肯定是不行的,每個位置都可以放置0-9之間的任何數,也就是說死遍歷的話一共有 1010 種可能性。
給定的數列是[0 1 2 3 4 5 6 7 8 9], 一共10個數,10個位置,所以5,6,7,8,9 對應的位置都不可能是》=2, 原因是如果5下面放置2,意味著 5 在下面要出現2次,假設a和b下面是5,那麼a要出現5次,b要出現5次,已經是10個位置被佔了,如果a和b都不等於2,那麼至少已經11個位置了(a5個,b5個,2 乙個); 如果a=2,那b出現5次,2出現5次(其中包括5下面的那個2),這個時候6,7,8,9下面都必須是0(假設6下面是1,那5要出現2次,6要出現1次,一共11個位置了), 也就是說b=0, 好, 0 出現5次,2出現5次 --> 可能嗎?無論你讓除6,7,8,9外的任何數下面是2,都不成立!
所以我們得出:
1: 5,6,7,8,9 下面只能是0或者1, 並且只能有乙個位置是1,其他的位置必須為0。
那可以讓5,6,7,8,9 下面都是0嗎?不行,如果這樣,0就已經出現了5次,那上排0下面的數字至少是5,也就是5出現了1次,和5下面是0矛盾!也就是說:
2: 5,6,7,8,9 下面必須也僅有乙個數字下面是1,其餘都是0,上排0位置下面至少是4。
如果5,6,7,8,9之間有乙個是1,那t[1] 至少是1 (我以t表示我們要得到的數列), 但是t[1]不能是1,因為t[5...9]之間已經有1個1,如果t[1]再=1, t中就有兩個1,所以t[1]至少是2 ! 如果t[1]是2,則t[2]是1, 因為2出現了一次。那到目前為止:
t[0] >=4, t[1]=2, t[2]=1, t[5...9] 之間有1個1,4個0, 只剩t[3],t[4]沒有定了。注意 t[5...9]中選中的那1個5...9放在**呢?有3個選擇: t[0], t[3] 或者t[4] (條件是0至少4個,2乙個,1兩個 --> 7個位置佔掉了),所以只能放在t[0], 於是:
t[0]=5...9, t[1]=2, t[2]=1, t[5...9] 之間1個1,4個0, 還剩兩個位置t[3],t[4],放0, 所以10個位置-1個位置(5到9之間的那個1)- 2個位置(t[1]和t[2]) - 1個位置(t[0]) = 6, 0 可以放6個,所以t[0]=7, t[3]=t[4]=0.
所以: 計算步驟是 -->
**:
public class tengxunnumberpicker
system.out.print("1st line is: ");
print(firstline);
secondline[1] = 2;
secondline[2] = 1;
final int numberofone = 2;
final int numberoftwo = 1;
final int numberofx = 1; // x is between n/2 to n-1
int numberofnonezero = numberofone + numberoftwo + numberofx;
int numberofzero = n - numberofnonezero;
secondline[0] = numberofzero;
secondline[numberofzero] = 1;
system.out.print("2nd line is: ");
print(secondline);
system.out.println();
}public static void print(int array)
system.out.println();
}public static void main(string args)
}輸出:
1st line is: 0 1 2 3 4 5 6 7 8 9
2nd line is: 6 2 1 0 0 0 1 0 0 0
1st line is: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
2nd line is: 11 2 1 0 0 0 0 0 0 0 0 1 0 0 0
leetcode 騰訊 全排列
原題 給定乙個沒有重複數字的序列,返回其所有可能的全排列。示例 輸入 1,2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 分析 首先從列表的第乙個元素開始,將其放到第一位 然後copy列表,將該元素刪掉,在新得到的列表中一次將元素填在後面 def permute...
排列數字問題
數字排列問題 今有7對數字 兩個1,兩個2,兩個3,兩個7,把它們排成一行。要求,兩個1間有1個其它數字,兩個2間有2個其它數字,以此類推,兩個7之間有7個其它數字。如下就是乙個符合要求的排列 17126425374635 當然,如果把它倒過來,也是符合要求的。請你找出另一種符合要求的排列法,並且這...
數字全排列
public class arrayrank private int n numbers.length 用來標記圖中結點是否被遍歷過 private boolean visited new boolean n 圖的二維陣列表示 private int graph new int n n 數字的組合 ...