[2016/07/02] LeetCode / Java - Day 10 -

来源:互联网 发布:mac去哪放光盘 编辑:程序博客网 时间:2024/05/29 02:42

318. Maximum Product of Word Lengths

Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0.

Example 1:

Given ["abcw", "baz", "foo", "bar", "xtfn", "abcdef"]
Return 16
The two words can be "abcw", "xtfn".

Example 2:

Given ["a", "ab", "abc", "d", "cd", "bcd", "abcd"]
Return 4
The two words can be "ab", "cd".

Example 3:

Given ["a", "aa", "aaa", "aaaa"]
Return 0
No such pair of words.

思路:我的解法是渣渣。。然后看了Discuss,果然。。。会了bit manipulation就可以拯救世界啊!!!

public class Solution {    public int maxProduct(String[] words) {        //学好 bit manipulation,算法都不怕QAQint n = words.length;if(n==1) return 0;int[] conv = new int[n];int max= 0;for(int i=0;i<n;i++){for(int j=0;j<words[i].length();j++){//这句话的意思实际上是把conv[i]转化成了一个存储a~z字母是否存在于words[i]中的26位数组//如果words[i]中有'a'字母,那么conv[i]倒数第一位是1,如果'b',倒数第二位是1,以此类推//如果要判断两个字符串中是否有字母重复,只要判断conv[i]&conv[j]是否等于0就可以了,多么巧妙!conv[i] = conv[i] | (1<<words[i].charAt(j)-'a');}for(int j=0;j<i;j++){if((conv[i] & conv[j]) == 0 )max = Math.max(max, words[i].length() * words[j].length());}}return max;    }}

51. N-Queens & 52. N-Queens II

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.."]]

思路:学算法的一定要做这道题!我却这么晚才做。。不过好歹磨了两个小时,也算是完全自己做出来的吧= =(对我就是这么弱(。・・)ノ)

因为一个是输出结果,一个是输出个数,基本没什么差,就一起说了。

基本思路就是用深搜。从第一行开始放置一个皇后,然后用hasPut List存储已经放置的格子号(0~n*n-1),每次放下一个皇后的时候,判断是不是处在别的皇后的攻击范围内,如果不可以放就检测下一个。如果可以放,那么就加入hasPut,如果没有放完,就进行下一次深搜。深搜完回来要注意清除这次的操作,倒退一下hasPut List中这次添加进去的部分。然后= =嗯,好像也没别的什么注意的了,我写的输出结果的程序(下面第一个程序)中,输出个数的统计不太对,见第二个程序。

1/ 输出结果程序

import java.util.ArrayList;import java.util.List;public class Solution {    public List<List<String>> solveNQueens(int n) {    int soluNum=0;    List<Integer> hasPut = new ArrayList<Integer>();    List<List<String>> result = new ArrayList<List<String>>();    //在第0(putNum)行开始放置一个皇后    dfs(0,n,soluNum, hasPut, result);return result;            }private static void dfs(int putNum, int n, int soluNum, List<Integer> hasPut, List<List<String>> result) {// 在棋盘上寻找可放置的位置for(int i=0;i<n;i++){//如果该位置可以放置if(canPut(putNum,i,n,hasPut)){hasPut.add(putNum*n+i);if(putNum==n-1){//所有的放置成功soluNum++;//调用输出函数result.add(printQ(n,hasPut));hasPut.remove(putNum);}else{dfs(putNum+1,n, soluNum, hasPut, result);hasPut.remove(putNum);}}}}//判断(putNum, i)是否与已放置的冲突private static boolean canPut(int putNum, int i,int n, List<Integer> hasPut) {for(int lll=0;lll<hasPut.size();lll++){int x=hasPut.get(lll);int p = x/n;int q=  x%n;if(putNum==p || i==q || putNum-p == i-q || putNum-p==q-i)return false;}return true;}private static List<String> printQ(int n, List<Integer> hasPut) {List<String> ls = new ArrayList<String>();for(int i=0;i<n;i++){String line = "";int jn= hasPut.get(i)-i*n;for(int j=0;j<n;j++){if(j==jn)line+="Q";else line+=".";}ls.add(line);}return ls;}}
2/ 输出个数程序

public class Solution {public int totalNQueens(int n) {    int soluNum=0;    List<Integer> hasPut = new ArrayList<Integer>();    //在第0(putNum)行开始放置一个皇后    soluNum = dfs(0,n,soluNum, hasPut);return soluNum;    }private static int dfs(int putNum, int n, int soluNum, List<Integer> hasPut) {// 在棋盘上寻找可放置的位置for(int i=0;i<n;i++){//如果该位置可以放置if(canPut(putNum,i,n,hasPut)){hasPut.add(putNum*n+i);if(putNum==n-1){//所有的放置成功soluNum++;hasPut.remove(putNum);}else{soluNum = dfs(putNum+1,n, soluNum, hasPut);hasPut.remove(putNum);}}}return soluNum;}//判断(putNum, i)是否与已放置的冲突private static boolean canPut(int putNum, int i,int n, List<Integer> hasPut) {for(int lll=0;lll<hasPut.size();lll++){int x=hasPut.get(lll);int p = x/n;int q=  x%n;if(putNum==p || i==q || putNum-p == i-q || putNum-p==q-i)return false;}return true;}}
哦对了还有个问题就是,它的Judge输入是连续的,所以你不能在Solution类里声明全局静态变量让所有方法调用,所以我就只能麻烦的不停传参数了。


0 0
原创粉丝点击