Java每日一练(20230507) 组合总和、缺失的正数、单词搜索II

简介: Java每日一练(20230507) 组合总和、缺失的正数、单词搜索II

1. 组合总和


给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。


candidates 中的数字可以无限制重复被选取。


说明:

   所有数字(包括 target)都是正整数。

   解集不能包含重复的组合。  


示例 1:

输入:candidates = [2,3,6,7], target = 7,

输出:[[7],[2,2,3]]


示例 2:

输入:candidates = [2,3,5], target = 8,

输出:[[2,2,2,2],[2,3,3],[3,5]]


提示:

   1 <= candidates.length <= 30

   1 <= candidates[i] <= 200

   candidate 中的每个元素都是独一无二的。

   1 <= target <= 500


出处:

https://edu.csdn.net/practice/27223965

代码:


import java.util.*;
public class combinationSum {
    public static class Solution {
      public List<List<Integer>> combinationSum(int[] candiates, int target) {
        List<List<Integer>> resultList = new ArrayList<>();
        List<Integer> result = new ArrayList<>();
        Arrays.sort(candiates);
        dfs(candiates, resultList, result, 0, target);
        return resultList;
      }
      private void dfs(int[] candiates, List<List<Integer>> resultList, List<Integer> result, int start, int target) {
        if (target < 0) {
          return;
        } else if (target == 0) {
          resultList.add(new ArrayList<>(result));
        } else {
          for (int i = start; i < candiates.length; i++) {
            result.add(candiates[i]);
            dfs(candiates, resultList, result, i, target - candiates[i]);
            result.remove(result.size() - 1);
          }
        }
      }
    }
    public static void main(String[] args) {
        Solution s = new Solution();
        int[] candidates = {2, 3, 6, 7};
        int target = 7;
        List<List<Integer>> res = s.combinationSum(candidates, target);
        System.out.println(res.toString());
        int[] candidates2 = {2, 3, 5};
        target = 8;
        res = s.combinationSum(candidates2, target);
        System.out.println(res.toString());
    }
}

输出:

[[2, 2, 3], [7]]

[[2, 2, 2, 2], [2, 3, 3], [3, 5]]


2. 缺失的第一个正数


给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。

进阶:你可以实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案吗?


示例 1:

输入:nums = [1,2,0]

输出:3


示例 2:

输入:nums = [3,4,-1,1]

输出:2


示例 3:

输入:nums = [7,8,9,11,12]

输出:1


提示:

   0 <= nums.length <= 300

   -2^31 <= nums[i] <= 2^31 - 1


以下程序实现了这一功能,请你填补空白处内容:


```Java

class Solution {
    public int firstMissingPositive(int[] nums) {
        int n = nums.length;
        int contains = 0;
        for (int i = 0; i < n; i++) {
            if (nums[i] == 1) {
                contains++;
                break;
            }
        }
        if (contains == 0) {
            return 1;
        }
        for (int i = 0; i < n; i++) {
            _________________;
        }
        for (int i = 0; i < n; i++) {
            int a = Math.abs(nums[i]);
            nums[a - 1] = -Math.abs(nums[a - 1]);
        }
        for (int i = 0; i < n; i++) {
            if (nums[i] > 0) {
                return i + 1;
            }
        }
        return n + 1;
    }
}
```

出处:

https://edu.csdn.net/practice/27223966

代码:

import java.util.*;
public class firstMissingPositive {
    public static class Solution {
        public int firstMissingPositive(int[] nums) {
            int n = nums.length;
            int contains = 0;
            for (int i = 0; i < n; i++) {
                if (nums[i] == 1) {
                    contains++;
                    break;
                }
            }
            if (contains == 0) {
                return 1;
            }
            for (int i = 0; i < n; i++) {
                if ((nums[i] <= 0) || (nums[i] > n)) {
                    nums[i] = 1;
                }
            }
            for (int i = 0; i < n; i++) {
                int a = Math.abs(nums[i]);
                nums[a - 1] = -Math.abs(nums[a - 1]);
            }
            for (int i = 0; i < n; i++) {
                if (nums[i] > 0) {
                    return i + 1;
                }
            }
            return n + 1;
        }
    }
    public static void main(String[] args) {
        Solution s = new Solution();
        int[] nums = {1,2,0}; 
        System.out.println(s.firstMissingPositive(nums));
        int[] nums2 = {3,4,-1,1}; 
        System.out.println(s.firstMissingPositive(nums2));
        int[] nums3 = {7,8,9,11,12}; 
        System.out.println(s.firstMissingPositive(nums3));
    }
}

输出:

3

2

1


3. 单词搜索 II


给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words,找出所有同时在二维网格和字典中出现的单词。


单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。


示例 1:

3c58915d280f9462e912c68fbe6cc128.jpeg


输入:board = [["o","a","a","n"],["e","t","a","e"],["i","h","k","r"],["i","f","l","v"]], words = ["oath","pea","eat","rain"]

输出:["eat","oath"]


示例 2:

2799340eb0a16624ef37341b8ab15fd9.jpeg

输入:board = [["a","b"],["c","d"]], words = ["abcb"]

输出:[]


提示:

   m == board.length

   n == board[i].length

   1 <= m, n <= 12

   board[i][j] 是一个小写英文字母

   1 <= words.length <= 3 * 104

   1 <= words[i].length <= 10

   words[i] 由小写英文字母组成

   words 中的所有字符串互不相同


出处:

https://edu.csdn.net/practice/27223967

代码:

import java.util.*;
public class findWords {
    public static class Solution {
        static int[][] d = new int[][] { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };
        static Map<String, Boolean> notExistWords = new HashMap<>();
        public List<String> findWords(char[][] board, String[] words) {
            List<String> ans = new ArrayList<>();
            Arrays.sort(words);
            notExistWords.clear();
            for (int i = 0; i < words.length; i++) {
                String word = words[i];
                if (i > 0 && word.equals(words[i - 1]))
                    continue;
                boolean notExistFlag = false;
                for (int j = 1; j < word.length(); j++) {
                    if (notExistWords.containsKey(word.substring(0, j + 1))) {
                        notExistFlag = true;
                        break;
                    }
                }
                if (notExistFlag)
                    continue;
                if (exist(board, word)) {
                    ans.add(word);
                } else {
                    notExistWords.put(word, false);
                }
            }
            return ans;
        }
        public boolean exist(char[][] board, String word) {
            int m = board.length;
            if (m == 0)
                return false;
            int n = board[0].length;
            if (n == 0)
                return false;
            if (word.equals(""))
                return true;
            boolean[][] f = new boolean[m][n];
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    if (word.charAt(0) == board[i][j]) {
                        f[i][j] = true;
                        boolean flag = dfs(i, j, 1, board, word, m, n, f);
                        if (flag)
                            return true;
                        f[i][j] = false;
                    }
                }
            }
            return false;
        }
        private boolean dfs(int i, int j, int k, char[][] board, String word, int m, int n, boolean[][] f) {
            if (k == word.length()) {
                return true;
            }
            for (int l = 0; l < 4; l++) {
                if (i + d[l][0] < m && j + d[l][1] < n && i + d[l][0] >= 0 && j + d[l][1] >= 0
                        && board[i + d[l][0]][j + d[l][1]] == word.charAt(k) && !f[i + d[l][0]][j + d[l][1]]) {
                    f[i + d[l][0]][j + d[l][1]] = true;
                    boolean flag = dfs(i + d[l][0], j + d[l][1], k + 1, board, word, m, n, f);
                    if (flag)
                        return true;
                    f[i + d[l][0]][j + d[l][1]] = false;
                }
            }
            return false;
        }
    }
    public static void main(String[] args) {
        Solution s = new Solution();
        char[][] board1 = {
            {'o', 'a', 'a', 'n'},
            {'e', 't', 'a', 'e'},
            {'i', 'h', 'k', 'r'},
            {'i', 'f', 'l', 'v'}};
        String[] words1 = {"oath", "pea", "eat", "rain"};
        System.out.println(s.findWords(board1, words1));
        char[][] board2 = {{'a', 'b'}, {'c', 'd'}};
        String[] words2 = {"abcb"};
        System.out.println(s.findWords(board2, words2)); 
    }
}



输出:

[eat, oath]

[]







目录
相关文章
|
4月前
|
Java
【java】poi 设置允许西文在单词中间换行
【java】poi 设置允许西文在单词中间换行
|
4月前
|
Java
CSDN每日一练(Java)--小艺的英文名
CSDN每日一练(Java)--小艺的英文名
|
3月前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
36 4
|
29天前
|
存储 自然语言处理 Java
|
3月前
|
Java
2021蓝桥杯大赛软件类国赛Java大学B组 完全日期 复杂遍历搜索
2021蓝桥杯大赛软件类国赛Java大学B组 完全日期 复杂遍历搜索
39 2
|
3月前
|
存储 算法 Java
Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。
【6月更文挑战第21天】Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。简单哈希表实现未涵盖冲突解决和删除操作。
36 1
|
2月前
|
存储 搜索推荐 算法
Java中的文本搜索与全文检索引擎
Java中的文本搜索与全文检索引擎
|
4月前
|
存储 Java 数据库连接
从 0 实现一个文件搜索工具 (Java 项目)
从 0 实现一个文件搜索工具 (Java 项目)
66 17
|
3月前
|
存储 前端开发 算法
2016届蓝桥杯大赛软件类国赛Java大学B组 反幻方 暴力搜索
2016届蓝桥杯大赛软件类国赛Java大学B组 反幻方 暴力搜索
24 0
|
4月前
|
安全 Java C++
2023-3-25 java选择题每日一练
2023-3-25 java选择题每日一练
39 1