leetcode演算法題解(Java版)-9-N皇后問題
一、貪心
題目描述
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array[−2,1,−3,4,−1,2,1,−5,4],
the contiguous subarray[4,−1,2,1]has the largest sum =6.
click to show more practice.
More practice:
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
思路
- 貪心的基本思想就是區域性找最優解,然後通過區域性的最優解得出來的結果,就是全域性的最優解,往往很難證明,但不妨先試一試。
- 就像這道題,因為要求的是最大的子串和,那顯然負數是起到反作用的,所以如果當前和是負的,那就果斷捨去,這也是貪心的思路。
- 這樣的解法時間複雜度是O(n)題目中說明了,可以使用分治進一步優化,請看程式碼二。
程式碼一
public class Solution {
public int maxSubArray(int[] A) {
int len=A.length;
if(len==0){
return 0;
}
int sum=A[0];
int max=A[0];
for(int i=1;i<len;i++){
if(sum<0){
sum=0;
}
sum+=A[i];
if(sum>max){
max=sum;
}
}
return max;
}
}
程式碼二
public class Solution {
public int div(int [] A,int left,int right){
int mid=(left+right)/2;
if(left==right){
return A[left];
}
int max1=div(A,left,mid);
int max2=div(A,mid+1,right);
int max3=-999999;//這裡不嚴謹,但不能用Integer.MIN_VALUE。
//否則max3+max4如果是負數和Integer.MIN_VALUE相加會溢位
int max4=-999999;
int tem=0;
for(int i=mid;i>=left;i--){
tem+=A[i];
max3=Math.max(max3,tem);
}
tem=0;
for(int i=mid+1;i<=right;i++){
tem+=A[i];
max4=Math.max(max4,tem);
}
return Math.max(Math.max(max1,max2),max3+max4);
}
public int maxSubArray(int[] A) {
int len=A.length;
if(len==0){
return 0;
}
return div(A,0,len-1);
}
}
二、N皇后問題
題目描述
Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.
思路
- 經典的老題目了,儲存當然是用一個陣列map解決:下標表示行號,每個map[i]中存放的數字表示列號。
- 然後就是寫一個判斷函式:1.判斷行是否重複:這個不需要判定,因為陣列下標即使行。2.判斷列是否重複,即map[t]!=map[i]。3.判斷對角線是否重複:即map[t]-map[i]!=t-i。
程式碼
public class Solution {
public int [] map=new int[30];
public int count=0;//注意!!不能寫成public static int count=0;
//否則全域性靜態變數的話,記憶體地址是一個,
//也就是當前測試用例會受到上一個測試用例中count的影響
public int totalNQueens(int n) {
backtrack(1,n);
return count;
}
public void backtrack(int t,int n){
if(t>n){
count++;
}
else{
for(int i=1;i<=n;i++){
map[t]=i;
if(valid(t)){
backtrack(t+1,n);
}
}
}
}
public boolean valid(int t){
for(int i=1;i<t;i++){
if(Math.abs(t-i)==Math.abs(map[t]-map[i])||map[i]==map[t]){
return false;
}
}
return true;
}
}
三、N皇后問題再度升級
題目描述
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.
Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens` placement, where`Q`and`.`both indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[
[".Q..", // Solution 1
"...Q",
"Q...",
"..Q."],
["..Q.", // Solution 2
"Q...",
"...Q",
".Q.."]
]
思路
- 和上一道只需要輸出個數,這道題也需要把所有的圖輸出來。只需要改動一個地方就OK。具體的看程式碼,寫的很清楚。
程式碼
import java.util.ArrayList;
public class Solution {
public int [] mark=new int [30];
public int count=0;
public ArrayList<String[]> resList=new ArrayList<>();
public ArrayList<String[]> solveNQueens(int n) {
backtrack(1,n);
return resList;
}
public StringBuilder drawOneLine(int n){
StringBuilder sb=new StringBuilder();
for(int i=0;i<n;i++){
sb.append(`.`);
}
return sb;
}
public boolean valid(int t){
for(int i=1;i<t;i++){
if(Math.abs(mark[i]-mark[t])==Math.abs(i-t)||mark[i]==mark[t]){
return false;
}
}
return true;
}
public void backtrack(int t,int n){
if(t>n){
String [] tem=new String[n];
for(int i=0;i<n;i++){
StringBuilder line=drawOneLine(n);
line.setCharAt(mark[i+1]-1,`Q`);//因為String從0開始而我的mark是從1開始記的
//這裡下標有點亂:mark陣列是從1開始的,而tem是從0開始的。
tem[i]=line.toString();
}
resList.add(tem);
}
else{
for(int i=1;i<=n;i++){
mark[t]=i;
if(valid(t)){
backtrack(t+1,n);
}
}
}
}
}
相關文章
- leetcode演算法題解(Java版)-14-第k小數問題LeetCode演算法Java
- leetcode演算法題解(Java版)-16-動態規劃(單詞包含問題)LeetCode演算法Java動態規劃
- leetcode演算法題解(Java版)-3-廣搜+HashMapLeetCode演算法JavaHashMap
- N皇后問題
- 從八皇后問題到回溯演算法演算法
- 演算法學習回顧-皇后問題演算法
- leetcode演算法題解(Java版)-12-中序遍歷LeetCode演算法Java
- leetcode演算法題解(Java版)-7-迴圈連結串列LeetCode演算法Java
- leetcode題解(陣列問題)LeetCode陣列
- 洛谷八皇后問題
- 八皇后問題python解法Python
- LeetCode 連結串列解題彙總 Java版LeetCodeJava
- leetcode題解(查詢表問題)LeetCode
- 回溯法(排列樹)解決八(N)皇后問題
- HDU - 2553 N皇后問題(DFS)
- P10871 皇后 Kraljice 題解
- 每日一題之拉低通過率 回溯演算法 leetcode 51 N皇后每日一題演算法LeetCode
- 2020-11-18 N皇后問題
- 八皇后問題分析和實現
- N皇后問題(各種優化)優化
- 7-22 n queens (10分) 八皇后(n皇后)問題
- Leetcode每日一題:52.N-Queens II(N皇后Ⅱ)LeetCode每日一題
- leetcode題解(0-1揹包問題)LeetCode
- 【LeetCode回溯演算法#07】子集問題I+II,鞏固解題模板並詳解回溯演算法中的去重問題LeetCode演算法
- LeetCode問題LeetCode
- 資料結構和演算法——遞迴-八皇后問題(回溯演算法)資料結構演算法遞迴
- Leetcode 演算法題解系列 - 最小棧LeetCode演算法
- LeetCode演算法題-Number of Boomerangs(Java實現)LeetCode演算法OOMJava
- leetcode 831題解【C++/Java/Python】LeetCodeC++JavaPython
- LeetCode演算法題LeetCode演算法
- Leetcode刷題中關於java的一些小問題LeetCodeJava
- leetcode 455題 javaLeetCodeJava
- LeetCode題解第122題LeetCode
- leetcode37 解數獨問題 hardLeetCode
- Java解決LeetCode72題 Edit DistanceJavaLeetCode
- 《劍指offer》JAVA題解,LeetCode評測JavaLeetCode
- leetcode排序專題演算法刷題LeetCode排序演算法
- Java在演算法題中的輸入問題Java演算法