day61-day62【代码随想录】二刷数组

news2024/10/1 15:27:04

文章目录

  • 前言
  • 一、有效三角形的个数【二分法】
  • 二、Pow(x, n)(力扣50)
    • 方法一
    • 方法二
  • 三、在 D 天内送达包裹的能力(力扣1011)【二分法】
  • 四、制作 m 束花所需的最少天数(力扣1482)【二分法】
  • 每日一题:使字符串平衡的最少删除次数(力扣1653)
  • 每日一题:礼物的最大价值(剑指 Offer 47)


前言

1、有效三角形的个数
2、Pow(x, n)
3、在 D 天内送达包裹的能力
4、制作 m 束花所需的最少天数


一、有效三角形的个数【二分法】

给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。
在这里插入图片描述
分析:
判断三条边能组成三角形的条件为:
任意两边之和大于第三边,任意两边之差小于第三边。
三条边长从小到大为 a、b、c,当且仅当 a + b > c 这三条边能组成三角形。
1、首先对数组排序
2、固定最短的两条边,二分查找最后一个小于两边之和的位置。可以求得固定两条边长之和满足条件的结果。枚举结束后,总和就是答案。

class Solution {
    public int triangleNumber(int[] nums) {
        //首先对数组进行排序:
        Arrays.sort(nums);
        int n = nums.length;
        int res =0;
        for(int i=0;i<n-2;i++){  //选第一条边
            for(int j=i+1;j<nums.length-1;j++){ //选第二条边
                int s = nums[i]+nums[j];//最小的两边相加
                //二分法找第三边 目的:找到最后一次出现比s小的位置
                int l=j+1;
                int r = n-1;
                while(l<=r){
                    int mid = (l+r)/2;
                    if(nums[mid]<s){//还要继续往前找
                        l=mid+1;
                    }else{
                        r=mid-1;
                    }
                }
                if(nums[r]<s){
                    res +=r-j;
                }
            }
        }
        return res;
    }
}

二、Pow(x, n)(力扣50)

实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )

在这里插入图片描述

方法一

快速幂 + 递归
在这里插入图片描述在这里插入图片描述

class Solution {
    public double myPow(double x, int n) {
        long N = n;
        return N>=0? quickMul(x,N):1.0/quickMul(x,-N);
    }
    public double quickMul(double x,long N){
        if(N==0) return 1.0;
        double y = quickMul(x,N/2);
        return N%2==0? y*y:y*y*x;
    }
}

在这里插入图片描述

方法二

快速幂 + 迭代
递归需要使用额外的栈空间,试着将递归转写为迭代
在这里插入图片描述

class Solution {
    public double myPow(double x, int n) {
        long N = n;
        return N>=0? quickMul(x,N):1.0/quickMul(x,-N);
    }
    public double quickMul(double x,long N){
        double ans = 1.0;
        double x_contribute = x;
        //对N进行二进制拆分
        while(N>0){
            if(N%2==1){
                ans *= x_contribute;
            }
            x_contribute*=x_contribute;
            N = N/2;
        }
        return ans;
    }
}

在这里插入图片描述

三、在 D 天内送达包裹的能力(力扣1011)【二分法】

传送带上的包裹必须在 days 天内从一个港口运送到另一个港口。

传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量(weights)的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。

返回能在 days 天内将传送带上的所有包裹送达的船的最低运载能力

分析:
比较类似于爱吃香蕉的珂珂,尽可能把时间撑满
对于这道题:假设每天最低运载能力为x,然后去遍历数组计算需要几天,如果发现大于days,那么最低运载能力++,直到==days,那么这个单调递增的过程可以通过二分法进行优化.
该题的关键点在于 :由于物品不存在拆分的情况,所以最低运载能力不能小于这堆重量的最大值

class Solution {
    public int shipWithinDays(int[] weights, int days) {
        int left = Arrays.stream(weights).max().getAsInt();
        int right = Arrays.stream(weights).sum();

        while(left<right){
            int mid = (left+right)/2; //最低承载量
            int day = needDay(weights,mid);
            if(day>days){ //说明最低承载量太小了 往上加一加
                left = mid+1;
            }
            if(day<=days){
                right=mid;
            }
        }
        return right;
    }

    public int needDay(int[] weights,int weight){
        int sum=0;
        int day = 0;
        for(int i=0;i<weights.length;i++){
            sum+=weights[i];
            if(sum>weight){
                day++;
                sum=0;
                i--;
            }
            if(i==weights.length-1 && sum<=weight){
                day++;
            }
        }
        return day;
    }
}

四、制作 m 束花所需的最少天数(力扣1482)【二分法】

给你一个整数数组 bloomDay,以及两个整数 m 和 k 。

现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花 。

花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,恰好 可以用于 一束 花中。

请你返回从花园中摘 m 束花需要等待的最少的天数。如果不能摘到 m 束花则返回 -1 。
在这里插入图片描述
分析:
二分法思想:先确定边界,以及什么是需要二分的
假设「所需的最少天数」为 ans ,那么以 ans 为分割点的数轴具有「二段性」:

  • 天数范围落在 [0,ans) 无法制作完成
  • 天数范围在 [ans,+∞)可以制作完成

范围的左边界为 0(代表尚未有花绽放),范围的右边界max(bloomDay[i])【最后一朵花的开放时间,代表所有花都开完】

class Solution {

        // 二分,O(n * log(max-min)) = O(10^5 * log10^9)
    public static int minDays(int[] bloomDay, int m, int k) {
        int n = bloomDay.length;
        if (m * k > n) return -1;

        int min = bloomDay[0], max = bloomDay[0]; // 最小值,最大值
        for (int day : bloomDay) {
            min = Math.min(min, day);
            max = Math.max(max, day);
        }
        // 二分:
        int l = min, r = max, ans = max;
        while (l <= r) {
            int day = l + (r-l)/2; // 能否在day天内制作m束花?
            if (canDo(bloomDay, m, k, day)) {
                ans = day;
                r = day-1;
            } else {
                l = day+1;
            }
        }

        return ans;
    }

    // 能否在day天内制作m束花,连续k朵花制作一束花
    private static boolean canDo(int[] bloomDay, int m, int k, int day) {
        int count = 0; // 连续花朵数量
        for (int d : bloomDay) {
            if (d <= day) { // 此花已开
                count++;
                if (count == k) { // 制作1束花
                    count = 0;
                    m--;
                    if (m == 0) return true;
                }
            } else {
                count = 0;
            }
        }
        return false;
    }
}

在这里插入图片描述

class Solution {

        // 二分,O(n * log(max-min)) = O(10^5 * log10^9)
    public int minDays(int[] bloomDay, int m, int k) {
        int n = bloomDay.length;
        if (m > n/k) return -1;

        int low = Arrays.stream(bloomDay).min().getAsInt();
        int high = Arrays.stream(bloomDay).max().getAsInt();

        while (low <high) {
            int day = low + (high-low)/2; // 能否在day天内制作m束花?
            if (canDo(bloomDay, m, k, day)) {
                high = day;
            } else low = day+1;
        }
        return low;
    }

    // 能否在day天内制作m束花,连续k朵花制作一束花
    public  boolean canDo(int[] bloomDay, int m, int k, int days) {
        int makeFlowers = 0;
        int flowers = 0; // 连续花朵数量
        for(int i=0;i<bloomDay.length;i++){
            if(bloomDay[i]<=days){
                flowers++;
                if(flowers==k){
                    makeFlowers++;
                    flowers=0;
                }
            }else flowers=0;
        }
        return makeFlowers>=m;
    }
}

思考:二分法的边界条件 +1 -1 哪个加 哪个减 以及 while 循环有没有等于号

一般可以left小于等于right,用ans 记录结果 如果mid 满足条件就 ans 等于mid ,最后return ans!!!!


每日一题:使字符串平衡的最少删除次数(力扣1653)

给你一个字符串 s ,它仅包含字符 ‘a’ 和 'b’​​​​ 。

你可以删除 s 中任意数目的字符,使得 s 平衡 。当不存在下标对 (i,j) 满足 i < j ,且 s[i] = ‘b’ 的同时 s[j]= ‘a’ ,此时认为 s 是 平衡 的。

请你返回使 s 平衡 的 最少 删除次数。

分析:
前后缀分解
在这里插入图片描述

class Solution {
   public int minimumDeletions(String s) {
        int remove = 127168;
        int delA,delB;
        for(int fengexian = 0;fengexian<=s.length();fengexian++){
            int left =0;
            int right=fengexian;
            delA = findA(s,0,fengexian-1);
            delB = findB(s,fengexian,s.length()-1);
            remove = Math.min(delA+delB,remove);
        }
        return remove;
    }
    public int findA(String s,int start,int end){
        int num=0;
        if(end<start){return num;}
        for(int i=start;i<=end;i++){
            if(s.charAt(i)=='b'){
                num++;
            }
        }
        return num;
    }

    public int findB(String s,int start,int end){
        int num=0;
        if(end<start){return 0;}
        for(int i=start;i<=end;i++){
            if(s.charAt(i)=='a'){
                num++;
            }
        }
        return num;
    }
}

在这里插入图片描述

优化:

class Solution {
    public  int minimumDeletions(String S) {
        var s = S.toCharArray();
        int del = 0;
        for (var c : s)
            del += 'b' - c; // 统计 'a' 的个数
        int ans = del;
        for (var c : s) {
            // 'a' -> -1    'b' -> 1
            del += (c - 'a') * 2 - 1;
            ans = Math.min(ans, del);
        }
        return ans;
    }
}

在这里插入图片描述

每日一题:礼物的最大价值(剑指 Offer 47)

在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

在这里插入图片描述

**分析:**比较简单的动规,类似机器人到达终点那道题

class Solution {
    public int maxValue(int[][] grid) {
        //动态规划
        int m = grid.length;
        int n = grid[0].length;
        int[][] dp = new int[m][n];
        //dp[i][j]数组的含义:到i行j列的最大价值为dp[i][j]
        //初始化
        int sum = 0;
        dp[0][0] = grid[0][0];
        for(int i=0;i<m;i++){
            sum+=grid[i][0];
            dp[i][0] = sum;
        }
        int sum2= 0;
        for(int j=0;j<n;j++){
            sum2+=grid[0][j];
            dp[0][j] = sum2;
        }
        
        //递推公式
        for(int i=1;i<m;i++){
            for(int j=1;j<n;j++){
                dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1])+grid[i][j];
            }
        }
        return dp[m-1][n-1];
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/398040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你真的知道MySQL索引组织数据的形式吗??

MySQL索引背后的数据结构前言MySQLMySQL背后的数据结构B树B树前言 好久不见,困扰了我许久的阴霾终于散去了,但是随之而来的是学校堆积如山的任务考试,这段时间不可否认我的学习效率和学习效果不是很佳,但是我之前就说过学习是需要贯穿程序猿一生的事情,流水不争先,争的是滔滔不…

Python基础 | Miniconda的安装

文章目录什么是Miniconda3Miniconda安装JupyterMiniconda运行JupyterMiniconda安装SpyderMiniconda和Anaconda对比Miniconda安装第三方库什么是Miniconda3 Miniconda是conda的免费的最小安装包。它是Anaconda的小型引导程序版本&#xff0c;仅包含了conda&#xff0c;Python&a…

【架构师】跟我一起学架构——Serverless

博客昵称&#xff1a;架构师Cool 最喜欢的座右铭&#xff1a;一以贯之的努力&#xff0c;不得懈怠的人生。 作者简介&#xff1a;一名Coder&#xff0c;软件设计师/鸿蒙高级工程师认证&#xff0c;在备战高级架构师/系统分析师&#xff0c;欢迎关注小弟&#xff01; 博主小留言…

个人收集的网站,可以参考(程序员可收藏)

程序员是一个需要不断学习的职业&#xff0c;幸运的是&#xff0c;在这个互联网时代&#xff0c;有很多渠道可以获取知识。 1在线教程 1、how2j.cn 地 址&#xff1a;https://how2j.cn/ 简 介&#xff1a;一个Java全栈开发教程网站&#xff0c;内容全面&#xff0c;简洁…

Docker Desktop安装本地Kubernetes集群

目录 下载安装说明 下载Docker Desktop windows需要开启Hyper-v 启用kubernetes kubectl配置 设置path环境变量 验证安装是否成功 实现Nginx容器的部署 按顺序进行nginx创建 Nginx的相关信息 Setup local Kubernetes cluster with Docker Desktop - DEV Community 上面…

UNIX网络编程-卷1_TCP粘包问题解决方法

这篇文件记录流协议粘包问题。首先记录什么是粘包&#xff0c;其次介绍粘包产生的原因&#xff0c;最后给出粘包的解决方法。 1 流协议与粘包 第一种情况&#xff1a;主机B一次读一个M消息 &#xff0c;不会产生粘包&#xff1b; 第二种情况&#xff1a;主机B一次读M1M2个消息…

数据模型(下):反规范化和维度模型

接前文: 数据模型(上)_专治八阿哥的孟老师的博客-CSDN博客 数据模型(中):键和规范化_专治八阿哥的孟老师的博客-CSDN博客 5.反规范化 反规范化是选择性地违反规范化规则并在模型中重新引入冗余的过程,额外的冗余有助于降低数据检索的时间,且创建一个用户友好的模型。 数…

一文吃透 Spring 中的IOC和DI

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【Redis应用】查询缓存相关问题解决(二)

&#x1f697;Redis应用学习第二站~ &#x1f6a9;起始站&#xff1a;【Redis应用】基于Redis实现共享session登录(一) &#x1f6a9;本文已收录至专栏&#xff1a;Redis技术学习 &#x1f44d;希望您能有所收获&#xff0c;底部附有完整思维导图 一.概述 本篇我们会一起来学习…

项目管理工具DHTMLX Gantt灯箱元素配置教程:只读模式

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求&#xff0c;具备完善的甘特图图表库&#xff0c;功能强大&#xff0c;价格便宜&#xff0c;提供丰富而灵活的JavaScript API接口&#xff0c;与各种服务器端技术&am…

【深度探讨】公共部门在选择区块链平台时要考虑的6个方面

发表时间&#xff1a;2022年8月17日 信息来源&#xff1a;bsvblockchain.org 与私营企业相比&#xff0c;全球的公共部门组织在考虑升级软件解决方案时面临着一系列的全新挑战。公共部门的决策流程冗长而复杂&#xff0c;他们要不惜一切代价避免对现有业务造成干扰&#xff0c;…

ISP全流程简介

ISP的pipline总结 ISP(Image Signal Processor)&#xff0c;即图像处理&#xff0c;主要作用是对前端图像传感器输出的信号做后期处理&#xff0c;主要功能有线性纠正、噪声去除、坏点去除、内插、白平衡、自动曝光控制等&#xff0c;依赖于ISP才能在不同的光学条件下都能较好…

面试 - 软件工程体系

今天是我人生中的第二次面试&#xff0c;第一次面试到技术问题。 面试公司&#xff1a;无锡信捷电气股份有限公司 面试时间&#xff1a;2023 年 3 月 6 日 15:30 面试地点&#xff1a;西安工程大学&#xff08;临潼校区&#xff09;D-188 在技术面中&#xff0c;我表现的不是很…

外骨骼机器人(五):步态分析之正常步态

研究病理步态之前,需要了解正常步态,作为判断标准。但是需要记住两个问题:1.“正常”因人而异,性别、年龄、身体情况都需要考虑在内,因此,需要对不同的个体选择合适的正常标准;2.即使病人的步态与正常步态有某种不同,这也不能说明这是不可取的,也不能说明应该把它变成…

计算机网络【王道】

文章目录第一章 计算机网络体系结构计算机网络概述计算机网络的概念计算机网络的组成计算机网络的功能计算机网络的分类计算机网络的性能指标计算机网络体系结构与参考模型计算机网络分层结构计算机网络协议、接口、服务的概念ISO/OSI 参考模型和 TCP/IP模型第二章物理层基本概…

Codeforces Round 855 (Div. 3) A-E2

比赛链接&#xff1a;Dashboard - Codeforces Round 855 (Div. 3) - Codeforces A&#xff1a;模拟 题意&#xff1a;给定一个字符串&#xff0c;问这个字符串是不是猫叫。定义是猫叫得字符串&#xff1a; 1&#xff1a;必须由大写或小写得M&#xff08;m&#xff09;,E&…

【大数据是什么】

大数据是什么大数据是做什么的&#xff1f;大数据主要有哪些职位 &#xff1f;大数据运维工程师数据仓库开发工程师ETL工程师大数据开发工程师BI工程师算法工程师大数据平台开发工程师大数据架构师讲述一下自己的大数据学习之路大数据是做什么的&#xff1f; 2014年&#xff0c…

Pytorch语义分割网络的详细训练过程——以NYUv2数据集为例

目录一、构建数据集1. 对Dataset和DataLoader的理解2. torch.utils.data.Dataset3. torch.utils.data.DataLoader4. 代码分块解析5. 完整代码6. 可视化二、模型搭建三、定义损失函数和优化器四、迭代训练参考文章一、构建数据集 1. 对Dataset和DataLoader的理解 Pytorch提供了…

[ROC-RK3568-PC] [Firefly-Android] 10min带你了解RTC的使用

&#x1f347; 博主主页&#xff1a; 【Systemcall小酒屋】&#x1f347; 博主追寻&#xff1a;热衷于用简单的案例讲述复杂的技术&#xff0c;“假传万卷书&#xff0c;真传一案例”&#xff0c;这是林群院士说过的一句话&#xff0c;另外“成就是最好的老师”&#xff0c;技术…