赞
踩
每一步向前都是向自己的梦想更近一步,坚持不懈,勇往直前!
第一题:41. 缺失的第一个正数 - 力扣(LeetCode)
今天这道题没有ac,写不动了,下次再通过吧,先给个半成品下次回来改掉
- class Solution {
- public int firstMissingPositive(int[] nums) {
- //使用掩码来做吧,通过$与|来记录一下各个数是否有出现
- int mask = 0;
- int n = nums.length;
- // 将正整数放置到对应的位置
- for (int num : nums) {
- if (num > 0 && num <= n) {
- mask |= (1 << (num - 1));
- }
- }
- // 找到第一个缺失的正整数
- for (int i = 0; i < n; i++) {
- if ((mask & (1 << i)) == 0) {
- return i + 1;
- }
- }
- // 如果数组中包含了1到n之间的所有正整数,则缺失的是n+1
- return n + 1;
- }
- }
- class Solution {
- public int trap(int[] height) {
- //单调站的传统题
- Deque<Integer> deque = new ArrayDeque<>();
- int res = 0;
- for(int i = 0; i < height.length; i++){
- while(!deque.isEmpty() && height[i] > height[deque.peekLast()]){
- int tmp = deque.pollLast();
- if(!deque.isEmpty()){
- //注意宽和高是如何得到的
- int h = Math.min(height[deque.peekLast()], height[i]) - height[tmp];
- int w = i - deque.peekLast() - 1;
- res += h * w;
- }
- }
- deque.offerLast(i);
- }
- return res;
- }
- }
- class Solution {
- public String multiply(String num1, String num2) {
- //直接模拟就好
- int m = num1.length();
- int n = num2.length();
- int[] result = new int[m + n]; // 保存每一位的乘积结果
- // 逐位相乘,注意从个位加至高位
- for (int i = m - 1; i >= 0; i--) {
- for (int j = n - 1; j >= 0; j--) {
- int mul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0'); // 乘积
- int sum = mul + result[i + j + 1]; // 加上当前位的值
- result[i + j] += sum / 10; // 进位
- result[i + j + 1] = sum % 10; // 当前位的结果
- }
- }
- // 将结果数组转换为字符串
- StringBuilder sb = new StringBuilder();
- for (int digit : result) {
- if (!(sb.length() == 0 && digit == 0)) { // 忽略结果数组的前导零
- sb.append(digit);
- }
- }
- return sb.length() == 0 ? "0" : sb.toString();
- }
- }
本题借用:【宫水三叶】的思路来解决的
- class Solution {
- public boolean isMatch(String ss, String pp) {
- int n = ss.length(), m = pp.length();
- // 技巧:往原字符头部插入空格,这样得到 char 数组是从 1 开始,而且可以使得 f[0][0] = true,可以将 true 这个结果滚动下去
- ss = " " + ss;
- pp = " " + pp;
- char[] s = ss.toCharArray();
- char[] p = pp.toCharArray();
- // f(i,j) 代表考虑 s 中的 1~i 字符和 p 中的 1~j 字符 是否匹配
- boolean[][] f = new boolean[n + 1][m + 1];
- f[0][0] = true;
- for (int i = 0; i <= n; i++) {
- for (int j = 1; j <= m; j++) {
- if (p[j] == '*') {
- //注意这个地方逻辑的判断:
- //条件一:不加'*'时的情况:f[i][j - 1]
- //条件二:(i - 1 >= 0 && f[i - 1][j])
- //满足其一即可为true
- f[i][j] = f[i][j - 1] || (i - 1 >= 0 && f[i - 1][j]);
- } else {
- //当字符为'?'时的判断逻辑,肯定要前面也满足true
- f[i][j] = i - 1 >= 0 && f[i - 1][j - 1] && (s[i] == p[j] || p[j] == '?');
- }
- }
- }
- return f[n][m];
- }
- }
第五题:45. 跳跃游戏 II - 力扣(LeetCode)
- class Solution {
- public int jump(int[] nums) {
- //不dp了,可以直接贪心策略实现,少用点空间
- if(nums.length == 0 || nums.length == 1){
- return 0;
- }
- int cnt = 0, curlen = 0, maxlen = 0;
- for(int i = 0; i < nums.length; i++){
- maxlen = Math.max(maxlen, i + nums[i]);
- if(maxlen >= nums.length - 1){
- cnt++;
- break;
- }
- if(i == curlen){
- curlen = maxlen;
- cnt++;
- }
- }
- return cnt;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。