首页 > 编程语言 >算法【二】

算法【二】

时间:2024-12-05 10:29:03浏览次数:6  
标签:容器 边界 int height 算法 指针 left

题目:202. 快乐数 - 力扣(LeetCode)

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

示例 1:

输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

示例 2:

输入:n = 2
输出:false

提示:

  • 1 <= n <= 231 - 1
题⽬分析: 为了⽅便叙述,将「对于⼀个正整数,每⼀次将该数替换为它每个位置上的数字的平⽅和,这⼀个 操作记为 x 操作; 题⽬告诉我们,当我们不断重复 x 操作的时候,计算⼀定会「死循环」,死的⽅式有两种:      情况⼀:⼀直在 1 中死循环,即 1 -> 1 -> 1 -> 1......      情况⼆:在历史的数据中死循环,但始终变不到 1 由于上述两种情况只会出现⼀种,因此,只要我们能确定循环是在「情况⼀」中进⾏,还是在「情 况⼆」中进⾏,就能得到结果。 简单证明:   a. 经过⼀次变化之后的最⼤值 9^2 * 10 = 810 ( 2^31-1=2147483647 。选⼀个更⼤的最             大 9999999999 ),也就是变化的区间在 [1, 810] 之间;   b. 根据「鸽巢原理」,⼀个数变化 811 次之后,必然会形成⼀个循环;   c. 因此,变化的过程最终会⾛到⼀个圈⾥⾯,因此可以⽤「快慢指针」来解决。 解法(快慢指针): 算法思路: 根据上述的题⽬分析,我们可以知道,当重复执⾏ x 的时候,数据会陷⼊到⼀个「循环」之中。 ⽽「快慢指针」有⼀个特性,就是在⼀个圆圈中,快指针总是会追上慢指针的,也就是说他们总会 相遇在⼀个位置上。如果相遇位置的值是 1 ,那么这个数⼀定是快乐数;如果相遇位置不是 1 的话,那么就不是快乐数。 补充知识:如何求⼀个数 n 每个位置上的数字的平⽅和。   a. 把数 n 每⼀位的数提取出来:   循环迭代下⾯步骤:     i. int t = n % 10 提取个位;     ii. n /= 10 ⼲掉个位;       直到 n 的值变为 0 ;   b. 提取每⼀位的时候,⽤⼀个变量 tmp 记录这⼀位的平⽅与之前提取位数的平⽅和 tmp = tmp + t * t 代码:
class Solution {
    //求平方和
    public int bitSum(int n){
        int sum=0;
        while(n!=0){
            int m=n%10;
            sum+=m*m;
            n/=10;
        }
        return sum;
    }
    public boolean isHappy(int n) {
        int slow=n;//第一个数
        int fast=bitSum(n);//为第二个数
        while(slow!=fast){
            slow=bitSum(slow);//每次走一步
            fast=bitSum(bitSum(fast));//每次走两步
        }
        return slow==1;
    }
}

题目:11. 盛最多水的容器 - 力扣(LeetCode)

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

示例 1:

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例 2:

输入:height = [1,1]
输出:1

提示:

  • n == height.length
  • 2 <= n <= 105
  • 0 <= height[i] <= 104
解法⼀(暴⼒求解)(会超时): 算法思路: 枚举出能构成的所有容器,找出其中容积最⼤的值。 容器容积的计算⽅式: 设两指针 i , j ,分别指向⽔槽板的最左端以及最右端,此时容器的宽度为 j - i 。由于 容器的⾼度由两板中的短板决定,因此可得容积公式 : v = (j - i) * min( height[i], height[j]) 解法⼆(对撞指针): 算法思路: 设两个指针 left , right 分别指向容器的左右两个端点,此时容器的容积 : v = (right - left) * min( height[right], height[left]) 容器的左边界为 height[left] ,右边界为 height[right] 。 为了⽅便叙述,我们假设「左边边界」⼩于「右边边界」。 如果此时我们固定⼀个边界,改变另⼀个边界,⽔的容积会有如下变化形式: 容器的宽度⼀定变⼩。 由于左边界较⼩,决定了⽔的⾼度。如果改变左边界,新的⽔⾯⾼度不确定,但是⼀定不会超 过右边的柱⼦⾼度,因此容器的容积可能会增⼤。 如果改变右边界,⽆论右边界移动到哪⾥,新的⽔⾯的⾼度⼀定不会超过左边界,也就是不会 超过现在的⽔⾯⾼度,但是由于容器的宽度减⼩,因此容器的容积⼀定会变⼩的。 由此可⻅,左边界和其余边界的组合情况都可以舍去。所以我们可以 left++ 跳过这个边界,继 续去判断下⼀个左右边界。 当我们不断重复上述过程,每次都可以舍去⼤量不必要的枚举过程,直到 left 与 right 相 遇。期间产⽣的所有的容积⾥⾯的最⼤值,就是最终答案。 代码:
class Solution {
    public int maxArea(int[] height) {
        int left=0;
        int right=height.length-1;
        int max=0;
        while(left<right){
            int v=Math.min(height[left],height[right])*(right-left);
            max=Math.max(max,v);
            if(height[left]<height[right]){
                left++;
            }else{
                right--;
            }
        }
        return max;
    }
}

标签:容器,边界,int,height,算法,指针,left
From: https://blog.csdn.net/2401_86415114/article/details/144249632

相关文章

  • 算法【一】
    题目: 283.移动零-力扣(LeetCode)给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。示例1:输入:nums=[0,1,0,3,12]输出:[1,3,12,0,0]示例2:输入:nums=[0]输......
  • 街面环卫算法视频分析服务器撑伞经营识别:智能分析技术如何管理和守护城市脉络
    随着城市化进程的加快,城市环卫管理面临着越来越多的挑战。如何高效、精准地进行城市环境卫生管理,成为了政府部门和相关企业亟待解决的问题。近年来,视频分析技术的崛起为环卫管理提供了新的解决思路。本文将探讨基于视频分析服务器的街面环卫撑伞经营识别算法的应用。一、背景与......
  • 《算法导论》英文版前言To the teacher第4段研习录:有答案不让用
    【英文版】Departingfromourpracticeinpreviouseditionsofthisbook,wehavemadepubliclyavailablesolutionstosome,butbynomeansall,oftheproblemsandexercises.OurWebsite,http://mitpress.mit.edu/algorithms/,linkstothesesolutions.Yo......
  • CDCL算法
    1.CDCL伪代码CDCL(CNF):副本=CNF//创建CNF的副本,不更改原CNFwhiletrue:while副本含有单位子句:对副本使用单位传播;if副本中含有取值为假的子句://发现冲突if现在的决策层是0:returnfalse;......
  • Pohlig-Hellman算法
    Pohlig-Hellman算法——用中国剩余定理考虑离散对数问题除了作为定理和算法外,建议读者将中国剩余定理看作一种思维方式。如果$m=m_1\cdotm_2\cdot\cdots\cdotm_t$是一组两两互质的整数的乘积,那么中国剩余定理告诉我们,求解关于$m$的方程实际上等价于分别求解关于......
  • [C#] 对24位图像进行水平翻转(FlipX)的跨平台SIMD硬件加速向量算法(使用YShuffleX3Kern
    在上一篇文章里,给大家讲解了32位图像水平翻转(FlipX)算法,于是本文来探讨更加复杂的24位图像水平翻转算法。本文除了会给出标量算法外,还会给出向量算法。且这些算法是跨平台的,同一份源代码,能在X86(Sse、Avx等指令集)及Arm(AdvSimd等指令集)等架构上运行,且均享有SIMD硬件加速。一、标......
  • [C#] 对24位图像进行水平翻转(FlipX)的跨平台SIMD硬件加速向量算法(使用YShuffleX3Kern
    在上一篇文章里,给大家讲解了32位图像水平翻转(FlipX)算法,于是本文来探讨更加复杂的24位图像水平翻转算法。本文除了会给出标量算法外,还会给出向量算法。且这些算法是跨平台的,同一份源代码,能在X86(Sse、Avx等指令集)及Arm(AdvSimd等指令集)等架构上运行,且均享有SIMD硬件加速。一、标......
  • [C#] 对24位图像进行水平翻转(FlipX)的跨平台SIMD硬件加速向量算法(使用YShuffleX3Kern
    在上一篇文章里,给大家讲解了32位图像水平翻转(FlipX)算法,于是本文来探讨更加复杂的24位图像水平翻转算法。本文除了会给出标量算法外,还会给出向量算法。且这些算法是跨平台的,同一份源代码,能在X86(Sse、Avx等指令集)及Arm(AdvSimd等指令集)等架构上运行,且均享有SIMD硬件加速。一、标......
  • 编程入门与进阶:从网页设计到C++算法,青少年编程的完美指南【文末推荐好书】
    文章目录一、编程入门:从网页设计开始1.1学习HTML:网页的骨架1.2学习CSS:网页的外观设计1.3学习JavaScript:网页的互动功能二、编程进阶:学习C++算法2.1学习C++基础:语法与数据结构2.2学习算法与数据结构2.3解决实际问题:编程竞赛与项目实践三、编程学习的心态与技巧3.1......
  • 每日一道算法题之岛屿数量-洪水填充
    classSolution{publicstaticvoidmain(String[]args){newSolution().numIslands(newchar[][]{{'1','0','1','1','0','1','1'}});}publicvoidf(inti,......