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

news/2024/11/17 2:37:50/

目录

1. 组合总和  🌟🌟

2. 缺失的第一个正数  🌟🌟🌟

3. 单词搜索 II  🌟🌟🌟

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


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:

输入: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:

输入: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]
[]


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/ 

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


http://www.ppmy.cn/news/60639.html

相关文章

虚函数、静态绑定和动态绑定

静态绑定 class Base { public:Base(int data) :ma(data) {}void show() { cout << "Base::show()" << endl; }void show(int) { cout << "Base::show(int)" << endl; }protected:int ma; };class Derive : public Base { public…

【LeetCode】9,回文数。 难度等级:简单。巧妙解法很多,值得推敲。

文章目录 一、题目二、我的解答&#xff1a;逐个判断对应位置的首末数字是否相同三、其他解答3.1 将数字x转为字符串进行处理3.2 反转一半数字进行比较 LeetCode 第9题&#xff0c;回文数&#xff1b;难度等级&#xff1a;简单 一、题目 二、我的解答&#xff1a;逐个判断对应…

【网络进阶】WebSocket协议

文章目录 1. Web实时技术的应用2. WebSocket协议介绍2.1 WebSocket的工作原理2.2 优点2.3. 使用场景2.4 实现细节 3. WebSocket服务器实现3.1 客户端代码&#xff08;HTML & JavaScript&#xff09;3.2 服务器端代码&#xff08;C&#xff09;3.3 测试结果 1. Web实时技术的…

CypherRat使用

cypherrat3.5 安卓远控&#xff0c;很早之前在tg下的&#xff0c;现在可能有高版本的 使用感受 图形化界面&#xff08;相比于msf&#xff09;可用于演练新场景&#xff0c;实战的话只能用xx破解版或是瑟瑟apk让人忽视风险继续安装由于国内安卓&#xff0c;部分功能失效 生成…

五种最危险的新兴网络攻击技术

SANS研究所的网络专家揭示了包括网络罪犯和民族国家行为者在内的网络攻击者正在使用的五种最危险的新兴网络攻击技术。在旧金山举行的RSA网络安全会议上&#xff0c;由SANS研究所的几位分析师组成的讨论组讨论了新兴的网络攻击战术、技术和程序&#xff0c;并提供了如何为企业做…

Python 面向对象

Python 是一种面向对象编程语言&#xff0c;支持类、对象、继承、多态等面向对象特性。下面是一些 Python 面向对象编程的基本概念和操作&#xff1a; 1. 定义类和对象 在 Python 中&#xff0c;可以使用 class 关键字定义类。类包含属性和方法&#xff0c;属性是类的数据成员…

界面控件DevExpress WPF富文本编辑器,让系统拥有Word功能(二)

DevExpress WPF控件的富文本编辑器允许开发者将文字处理功能集成到下一个WPF项目中&#xff0c;凭借其全面的文本格式选项、邮件合并以及丰富的终端用户选项集合&#xff0c;可以轻松地提供Microsoft Word功能。 DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足…

AMBA协议-AXI协议详解(读写时序、Outstanding、乱序传输、原子操作)

目录 1. AXI 写通道信号 1.1. 写地址通道信号 1.2. 写数据通道信号 1.3. 写response通道信号 1.5. 握手规则 1.4. AXI 写通道之间关系 2. AXI 读通道信号 2.1. 读地址通道信号 2.2. 读数据通道信号 2.3. AXI 读通道之间关系 3. AXI传输 3.1. AXI突发读传输 3.2. …