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);
                }
            }
        }
    }
    
}
目录
相关文章
|
4天前
|
存储 算法 安全
探究‘公司禁用 U 盘’背后的哈希表算法与 Java 实现
在数字化办公时代,信息安全至关重要。许多公司采取“禁用U盘”策略,利用哈希表算法高效管理外接设备的接入权限。哈希表通过哈希函数将设备标识映射到数组索引,快速判断U盘是否授权。例如,公司预先将允许的U盘标识存入哈希表,新设备接入时迅速验证,未授权则禁止传输并报警。这有效防止恶意软件和数据泄露,保障企业信息安全。 代码示例展示了如何用Java实现简单的哈希表,模拟公司U盘管控场景。哈希表不仅用于设备管理,还在文件索引、用户权限等多方面助力信息安全防线的构建,为企业数字化进程保驾护航。
|
12天前
|
监控 算法 网络协议
Java 实现局域网电脑屏幕监控算法揭秘
在数字化办公环境中,局域网电脑屏幕监控至关重要。本文介绍用Java实现这一功能的算法,涵盖图像采集、数据传输和监控端显示三个关键环节。通过Java的AWT/Swing库和Robot类抓取屏幕图像,使用Socket进行TCP/IP通信传输图像数据,并利用ImageIO类在监控端展示图像。整个过程确保高效、实时和准确,为提升数字化管理提供了技术基础。
48 15
|
3月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
107 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
4天前
|
运维 监控 算法
企业局域网监控软件中 Java 优先队列算法的核心优势
企业局域网监控软件是数字化时代企业网络安全与高效运营的基石,犹如一位洞察秋毫的卫士。通过Java实现的优先队列算法,它能依据事件优先级排序,确保关键网络事件如异常流量、数据泄露等被优先处理,保障系统稳定与安全。代码示例展示了如何定义网络事件类并使用PriorityQueue处理高优先级事件,尤其在面对疑似风险时迅速启动应急措施。这一核心技术助力企业在复杂网络环境中稳健前行,护航业务腾飞。
49 32
|
3天前
|
存储 监控 算法
探秘局域网桌面监控:深入剖析 Java 语言核心算法
在数字化办公时代,局域网桌面监控如同企业的“智慧鹰眼”,确保工作效率与数据安全。本文以Java为载体,揭示哈希表在监控中的关键应用。通过高效的数据结构和算法,哈希表能快速索引设备连接信息,大幅提升监控的时效性和响应速度。代码示例展示了如何用Java实现设备网络连接监控,结合未来技术如AI、大数据,展望更智能的监控体系,助力企业在数字化浪潮中稳健前行。
|
18天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
27 6
|
2月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
3月前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
38 2
|
3月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
174 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
3月前
|
算法 Java Linux
java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
这篇文章介绍了如何在Java中使用Graphics2D在图片上绘制文字,并实现自动换行的功能。
192 0