727 字
4 分钟
LeetCode刷题(分糖果问题、单词搜索)

分糖果问题#

题目描述#

一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下:

\1. 每个孩子不管得分多少,起码分到一个糖果。

\2. 任意两个相邻的孩子之间,得分较多的孩子必须拿多一些糖果。(若相同则无此限制)

给定一个数组 arrarr 代表得分数组,请返回最少需要多少糖果。

要求: 时间复杂度为 O(n)O(n) 空间复杂度为 O(n)O(n)

数据范围: 1≤n≤1000001≤n≤100000 ,1≤ai≤10001≤a**i≤1000

题解#

贪心算法,从左向右如果右边的数大于左边,他需要的糖果就要在左边的基础上+1,从右往左,思路一致,但是要保留左边的糖果限制,不能比左得出的结果小,取最大的那个,最后将糖果加在一起

public class Solution {
    public int candy (int[] arr) {
        // write code here
        int n = arr.length;
        int count[] = new int[n];
        Arrays.fill(count, 1);
        for(int i = 1; i < n; i++) {
            if(arr[i] > arr[i - 1]) {
                count[i] = count[i - 1] + 1;
            }
        }
        for(int i = n - 2; i >= 0; i--) {
            if(arr[i] > arr[i + 1]) {
                count[i] = Math.max(count[i], count[i + 1] + 1);
            }
        }
        int result = 0;
        for(int con : count) {
            result += con;
        }
        return result;
    }
}

单词搜索#

题目描述#

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false

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

示例 1:

283

输入:board = [['A','B','C','E'],['S','F','C','S'],['A','D','E','E']], word = "ABCCED"
输出:true

示例 2:

284

输入:board = [['A','B','C','E'],['S','F','C','S'],['A','D','E','E']], word = "SEE"
输出:true

题解#

回溯法,通过遍历每个起始点,递归使用check看上下左右是否匹配后续的对应字符,不匹配返回false,再判断是否匹配到了最后一个字符,如果是返回true,没有则继续匹配上下左右的字符,只要有一种匹配结果匹配成功即可返回true

class Solution {
    public boolean exist(char[][] board, String word) {
        int row = board.length;
        int col = board[0].length;
        boolean[][] visited = new boolean[row][col];
        for(int i = 0; i < row; i++) {
            for(int j = 0; j < col; j++) {
                boolean flag = check(board, visited, i, j, word, 0);
                if(flag) {
                    return true;
                }
            }
        }
        return false;
    }

    public boolean check(char[][] board, boolean[][] visited, int i, int j, String word, int index) {
        if(i >= 0 && i < board.length && j >= 0 && j < board[0].length && !visited[i][j]) {
            if(word.charAt(index) != board[i][j]) {
                return false;
            }
            if(index == word.length() - 1) {
                return true;
            }
            visited[i][j] = true;
            boolean u = check(board, visited, i - 1, j, word, index + 1);
            boolean d = check(board, visited, i + 1, j, word, index + 1);
            boolean l = check(board, visited, i, j - 1, word, index + 1);
            boolean r = check(board, visited, i, j + 1, word, index + 1);
            visited[i][j] = false;
            return u || d || l || r;
        }
        return false;
    }
}
LeetCode刷题(分糖果问题、单词搜索)
https://thrinisty.github.io/Blog/posts/leetcode刷题分糖果问题单词搜索/
作者
Thrinisty
发布于
2025-10-14
许可协议
CC BY-NC-SA 4.0