papilong123 / LeetCode

leetcode algorithm

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

滑动窗口

动态规划

dfs

二分查找

回溯

排列、组合、子集相关问题(0到100题)

  • $39_组合总和(无重复元素数组的和等于target的组合,回溯 + 剪枝target < 0)
  • $40_组合总和II( 有重复元素数组的和等于target的组合集合,注意结果去重,排序+剪枝重复相邻元素)
  • $77_组合(n个元素的k组合,dfs函数中元素不能重复所以有i+1)
  • $46_全排列(无重复元素,bool数组表示用过的数字)
  • $47_全排列II(有重复元素,先排序+剪枝重复相邻元素,bool数组表示用过的数字)
  • $60_排列序列(困难)( 好题,计算还未确定的数字的全排列的个数,第1次进入的时候是n-1)***
  • $78_子集(两条路,选或不选)
  • $90_子集II(有重复元素,结果不能有重复元素)
  • $89_格雷编码(镜像二叉树,左右子树递归时传入[0, 1]的不同的遍历顺序)

基础

  • $17_电话号码的字母组合( 字符和字符串hashmap)
  • $22_括号生成( 二叉树左右括号同时计数,右括号不大于左括号,都等于n时加入结果集)
  • $37_解数独( 每个空白位置用符合条件的1到9逐个尝试,返回后面递归返回的结果,9个都不行返回false,遍历完没有返回false,说明找到了合适棋盘位置了)
  • $51_N皇后(三个集合,回溯前在集合中剪枝,)
  • $79_单词搜索(字符串的下一个和当前元素的邻居不相等则剪枝)
  • $93_复原IP地址(先判断截取的 ip 段是否合法,然后用截取函数截取字符串)

进阶

分治

链表

并查集

单调栈

入门

下一个更大元素
去除元素后字典序最小

进阶

快速幂

大杂烩

java
import java.util.Scanner;

public class Solution {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 读取 n m
        int n = scanner.nextInt(), m = scanner.nextInt();

        int[] nums = new int[n + 1];
        int[] pref = new int[n + 1];
        int[] mx = new int[n + 1];
        // 读入数组
        for (int i = 1; i <= n; i++) {
            nums[i] = scanner.nextInt();
            pref[i] = pref[i - 1] + nums[i];
            mx[i] = Math.max(pref[i], mx[i - 1]);
        }
        int ans = Integer.MAX_VALUE;
        for (int i = m; i <= n; i++) {
            ans = Math.min(ans, pref[i] - mx[i - m]);
        }
        // 将结果输出到标准输出
        System.out.println(ans);
    }
}
python
n, m = map(int, input().split())
a = [0] + list(map(int, input().split()))
pref = [0] * (n + 1)
mx = [0] * (n + 1)
for i in range(1, n + 1):
    pref[i] = pref[i - 1] + a[i]
    mx[i] = max(pref[i], mx[i - 1])
from functools import reduce

print(reduce(min, [pref[i] - mx[i - m] for i in range(m, n + 1)], 1 << 30))
cpp
#include <iostream>
#include <vector>
#include <cassert>

using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  vector<int> a(n + 1);
  vector<int> pref(n + 1);
  vector<int> mx(n + 1);
  int ans = (1 << 30);
  for (int i = 1; i <= n; ++i) {
    cin >> a[i];
    pref[i] = pref[i - 1] + a[i];
    mx[i] = max(mx[i - 1], pref[i]);
  }
  for (int i = m; i <= n; ++i) {
    ans = min(ans, pref[i] - mx[i - m]);
  }
  cout << ans << endl;
  return 0;
}

About

leetcode algorithm


Languages

Language:Java 49.3%Language:Python 27.5%Language:C++ 21.4%Language:CMake 1.7%