LeetCode 21は2つの順序付けられたリンクリストと22のブラケット生成をマージします

Wechat検索bigsai、グループへの返信、時計への参加。メンテナンスは簡単ではありません。好きにしてサポートしてください!

ここに画像の説明を挿入

2つの順序付きリストをマージする

2つの昇順リンクリストを新しい昇順リンクリストに結合して戻ります。新しいリンクリストは、指定された2つのリンクリストのすべてのノードを接合することによって構成されます。

例:

入力:1-> 2-> 4、1-> 3-> 4
出力:1-> 1-> 2-> 3-> 4-> 4

分析:
アイデア、この質問のアイデアは比較的単純で、2つの順序付けられたリンクリストをマージし、新しいリンクリストを作成してから、2つのサブリンクリストをたどって比較し、現在の小さい方のリストに挿入します。

具体的なコードは次のとおりです。

 public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    
    
      ListNode value=new ListNode(Integer.MIN_VALUE);
      ListNode team=value;
      while (l1!=null||l2!=null) {
    
    
		if(l1==null)
		{
    
    
			team.next=l2;break;
		}
		else if (l2==null) {
    
    
			team.next=l1;break;
		}
		else {
    
    
			if(l1.val<l2.val)
			{
    
    
				team.next=new ListNode(l1.val);
				team=team.next;
				l1=l1.next;
			}
			else {
    
    
				team.next=new ListNode(l2.val);
				team=team.next;
				l2=l2.next;
			}
		  }
	   }
       return value.next;
  }

ここに画像の説明を挿入

もちろん、リンクリストL1の1つを修正するように設定してから、他のL2を挿入してマージすることもできます。具体的には、次のステップに進むたびに挿入する必要がある場合は、別のリンクリスト全体が挿入されます。これは、L1ノードとL2ノードの位置を交換することと同じです。
ここに画像の説明を挿入
具体的な実装は次のとおりです。

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    
    
	  if(l1==null)return l2;
	  if(l2==null)return l1;
	  if(l1.val>l2.val)//l1更小
	  {
    
    
		  ListNode team=l1;
		  l1=l2;
		  l2=team;
	  }
      ListNode value=l1;
      while (l2!=null) {
    
    
		if(l1.next==null)
		{
    
    
			l1.next=l2;break;
		}
		else if (l1.next.val<l2.val) {
    
    
			l1=l1.next;
		}
		else {
    
    
			ListNode node=l1.next;
			l1=l1.next=l2;
			l2=node;
			//l1=l1.next;
			
		}
	   }
       return value; 
  }

ここに画像の説明を挿入

ブラケットの生成

数字nは括弧の生成の対数を表します。可能なすべての有効な括弧の組み合わせを生成する関数を設計してください。

例:

入力:n = 3
出力:[
「((()))」、
「(()())」、
「(())()」、
「()(())」、
「()()( ) "
]

分析
この質問には、すぐに解決できるアイデアがない可能性があります。使用する数学的な方法はわかりませんが、可能なすべてのブラケットの組み合わせを確認する必要があります2つの単語はすべて明らかに質問です。これはdfsまたはbfsであり、dfsがここで使用されます。

dfs検索では、すべての状況、および初期条件と停止条件のトラバースを検討する必要があります。dfsはバックトラックであることがわかっています。文字列が頻繁に作成および削除される場合、効率は非常に低いため、バックトラックプロセスを使用して文字列(StringBuilder)を復元すると、大幅に改善できます。効果。そして特にこのように考える必要があります:

  • ブラケットのNペア。n (とn があることを示し)、2つの数値を使用して2つの数値をマークできます。
  • (数値は数値より小さくすることはできません)。そうでない場合、有効な括弧は満たされません。
  • (使い切った場合は追加のみ可能、使い切っていない)場合()数が足りない場合は現在追加(または追加できます)
  • スコープ、パラメーター、その他の問題に注意を払う

具体的な実装コードは次のとおりです。

 List<String>list;
	public List<String> generateParenthesis(int n) {
    
    
		list=new ArrayList<String>();
		StringBuilder sBuilder=new StringBuilder();
		dfs(sBuilder,0,0,n);
		return list;	

    }
	private void dfs(StringBuilder sBuilder, int i, int j,int n) {
    
    
		if(j==n) {
    
    list.add(sBuilder.toString());return;}
		if(i<j)return;
		if(i<n)
		{
    
    
			sBuilder.append('(');
			dfs(sBuilder, i+1, j, n);
			sBuilder.deleteCharAt(i+j);
		}
		if(i>j)
		{
    
    
			sBuilder.append(')');
			dfs(sBuilder, i, j+1, n);
			sBuilder.deleteCharAt(i+j);
		}		
	}

ここに画像の説明を挿入

これで2つの質問は終わりです。よろしければ、気に入ってサポートしてください。WeChatで検索してbigsai返信し、グループに参加して一緒にチェックインしてください。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_40693171/article/details/108432953