題目描述:現在給定乙個只由字元 'd' 和 'i' 組成的 秘密簽名。'd' 表示兩個數字間的遞減關係,'i' 表示兩個數字間的遞增關係。並且 秘密簽名 是由乙個特定的整數陣列生成的,該陣列唯一地包含 1 到 n 中所有不同的數字(秘密簽名的長度加 1 等於 n)。例如,秘密簽名 "di" 可以由陣列 [2,1,3] 或 [3,1,2] 生成,但是不能由陣列 [3,2,4] 或 [2,1,3,4] 生成,因為它們都不是合法的能代表 "di" 秘密簽名 的特定串。
現在你的任務是找到具有最小字典序的 [1, 2, ... n] 的排列,使其能代表輸入的 秘密簽名。
題目難點分析:
怎麼樣才能把n個數排成想要的樣子,可以使用dfs也可以使用動態規劃。但是思路都比較麻煩
題目巧點:
首先輸入時順序排列的1、2、3。。。。 第二個它要求的時最小的字典序排列當然最大也可以。什麼是最小,就是把小的盡量往前面排。因此題目的意義就變成了在符合要求的條件下,把越小的往前面排,那我們就從最小的開始排:當第乙個為「i」時,把大於當前佇列頭的最小的往裡面放,當為『d』時,把小於當前最小的往裡面放,那麼,當為dddididii時,我可來看:先放1,但是第二個肯定大於1,那麼我們第乙個放什麼呢,第乙個放什麼和後面放什麼有關,如果只有乙個那結果就是21,接下來還是d,321;接下來還是d,4321;然後是i,那是多少呢,43215.所以我們看到什麼規律呢,好像還是沒什麼頭緒,可能就是說出現乙個d就把數字放進乙個棧裡面,當出現i的時候就把他們都倒出來。
踩的坑:沒給returnsize賦值,第二個,就是malloc的長度。
/**
* note: the returned array must be malloced, assume caller calls free().
*/int* findpermutation(char * s, int* returnsize)
} else
}while (pointstack2)
// if (leninput != 0)
*returnsize = leninput + 1;
return stack1;
}
Leetcode 排列組合
給出兩個整數n和k,返回從1到n中取k個數字的所有可能的組合 例如 如果n 4,k 2,結果為 2,4 3,4 2,3 1,2 1,3 1,4 思路 基本的搜尋題 思路一 遞迴方式 即返回start end之間 k大小的序列 返回結果與前乙個元素組配即可 相當於子問題求解思路 缺點 需要組配vetc...
c 排列組合排序 排列組合 組合數專題
書接上回,本期正男老師將帶大家梳理排列組合中組合數的相關考點,組合數考點可以細分為4類,分別為 分類數數問題 分組排序問題 塗色問題以及插棍問題。近六年高考真題中,組合數考點共涉及5道。組合數專題高考真題分布 組合數的定義以及公式如下圖所示。組合數定義 分類數數問題與排列問題中的窮舉問題相似,但分類...
排列組合實現
演算法 與網際網路 組合演算法 本程式的思路是開乙個陣列,其下標表示1到m個數,陣列元素的值為1表示其下標 代表的數被選中,為0則沒選中。首先初始化,將陣列前n個元素置1,表示第乙個組合為前n個數。然後從左到右掃瞄陣列元素值的 10 組合,找到第乙個 10 組合後將其變為 01 組合,同時將其左邊的...