元の公開アカウント:
bigsai
良ければ、気に入って収集することを忘れないでください!bigsaiを
フォローして返信し、Javaの高度なpdfリソースを受け取り、グループに返信してLikouパンチグループに参加します。
先週のチェックインコンテンツ:43文字列乗算と44ワイルドカードマッチング 45ジャンプゲームと46フルアレンジメント
昨日のチェックインコンテンツ:LeetCode 47フルアレンジメントⅡと48回転画像
文字の異音のグループ化
文字列の配列が与えられた場合、文字失読症を組み合わせます。脂肪族の単語は、同じ文字で配置が異なる文字列を指します。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
説明:
すべてのエントリは小文字です。
回答が出力される順序は考慮されません。
分析
タイトルの意味は、いくつかの文字列の単語を与えてから、すべて同じ文字を1つにまとめることList<String>
です。私たちの中心的な質問は、これをどこに置くかです。
毎回ブルートフォース列挙を使用して判断することはできますが、それは非効率的であるため、ハッシュストレージを使用できます。Map<String,List<String>>
ストレージ用のHashMapのタイプを作成します。
実装コードは次のとおりです。
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>>lists=new ArrayList<>();
Map<String,List<String>>map=new HashMap<>();
for(String str: strs)
{
char vachar[]=str.toCharArray();
Arrays.sort(vachar);
String team=String.copyValueOf(vachar);
List<String>list=map.getOrDefault(team,new ArrayList<>());
list.add(str);
map.put(team,list);
}
// for(List<String> list:map.values())
// {
// lists.add(list);
// }
lists.addAll(map.values());
return lists;
}
結果:
Pow(x、n)
明らかに高速指数アルゴリズムですが、私自身の迅速な指数導入を強くお勧めします:データ構造とアルゴリズム-これは最も簡単な迅速指数の説明かもしれませんが、
いくつかの点に注意する必要があります:
- 負の数の処理、および負の数は、intの最小値に範囲外の符号変換値を加えたものである可能性があります。したがって、負の数を正の数に変換すると、負の累乗を正の累乗に変換して計算することができます。たとえば、5 -2147483648 = 5 -1 x 5 -2147483647 =(1/5)x(1/5)2147483647。intの範囲は[-2147483648,2147483647]です。
- 停止条件に注意してください。理論的には、関数を書き直してわずかに最適化できますが、高速電力ログレベルの複雑さが比較的低いため、ここでは最適化せずに直接記述します。
public double myPow(double x, int n) {
if(n<0)
return (1.0/x)*myPow(1.0/x,-(n+1));
if(n==0)
return 1;
else if(n%2==0)
return myPow(x*x,n/2);
else
return x*myPow(x*x,n/2);
}
クイーンN
nクイーン問題は、n×nチェスボードにnクイーンを配置し、クイーンが互いに攻撃できないようにする方法を研究します。
上の写真は、8つの女王の問題の解決策を示しています。
整数nが与えられた場合、すべての異なるnクイーン問題の解を返します。
各ソリューションには、n-クイーン問題の明確なポーン配置計画が含まれています。ここで、「Q」と「。」はそれぞれクイーンと空の位置を表します。
例:
输入:4
输出:[
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。
ヒント:
クイーンはお互いを攻撃することはできません。つまり、2つのクイーンを同じ水平、垂直、または斜めの線上に置くことはできません。
エイトクイーンズの問題私はこの記事を読みます:バックトラックアルゴリズム|当時私たちを困惑させてきたエイトクイーンズの問題を思い出します。それはすでに非常に明確です。理解できない場合は、詳細に読むことができます。
特定の実装ではmap[][]
、各場所のシンボルを記録するためにマップが必要であり、ルールに従って保存されますが、StringBuilder[]
ここでは配列を使用して完了します。
また、1行ずつ方向を判断する場合、水平方向を判断する必要はありません。
コードを添付してください:
// boolean heng[];
boolean shu[];
boolean zuoxie[];
boolean youxie[];
public List<List<String>> solveNQueens(int n) {
List<List<String>> list=new ArrayList<List<String>>();
StringBuilder stringBuilder[]=new StringBuilder[n];
for(int i=0;i<n;i++)
{
stringBuilder[i]=new StringBuilder();
for(int j=0;j<n;j++)
{
stringBuilder[i].append('.');
}
}
shu=new boolean[n];
zuoxie=new boolean[n*2];
youxie=new boolean[n*2];
dfs(0,stringBuilder,list,n);
return list;
}
private void dfs(int index, StringBuilder sBuilder[], List<List<String>> list,int n) {
// TODO Auto-generated method stub
if(index==n)//存入
{
List<String>val=new ArrayList<String>();
//StringBuilder sBuilder=new StringBuilder();
for(int i=0;i<n;i++)
{
val.add(sBuilder[i].toString());
}
list.add(val);
}
else {
for(int j=0;j<n;j++)
{
if(!shu[j]&&!zuoxie[index+j]&&!youxie[index+(n-1-j)])
{
shu[j]=true;
zuoxie[index+j]=true;
youxie[index+(n-1-j)]=true;
//map[index][j]='Q';
sBuilder[index].setCharAt(j, 'Q');
dfs(index+1,sBuilder, list, n);
shu[j]=false;
zuoxie[index+j]=false;
youxie[index+(n-1-j)]=false;
sBuilder[index].setCharAt(j, '.');
//map[index][j]='.';
}
}
}
}
常におなじみの100%:
結論:了解しました。今日はここにいます。元のテクノロジーのパブリックアカウントに注目してください:[ bigsai ]、グループに返信し、作成者のWeChatを追加してチェックインに参加してください。「bigsai」に返信して、高度なリソースを入手してください。