zoukankan      html  css  js  c++  java
  • 268. 丢失的数字

     

    傻傻的想了半天,看了题解才想起来高斯求和,真的巧妙。

    高斯求和,高中数列得知识,等差数列之和=(首项+尾项)*项数/2

    根据题意可得只少一个元素,那么先算出和然后再迭代一次减去所有元素即可

    时间O(n),空间O(1)

    public int missingNumber(int[] nums) {
            int sum = (1+nums.length)*nums.length/2;
            for (int num:nums){
                sum-=num;
            }
            return sum;
        }

    进阶:

    本题中由于n的范围是10^4,所以我们使用高斯求和时不用担心溢出的问题,但是当

    范围扩大到10^5时,就无法继续这么使用了,为了应对这个问题,我们做了一点优化,

    不一次性的去计算和,而是在遍历中一边求和一遍求差。

    相比高斯求和的方法,优点在于避免了溢出的风险,缺点在于拆分计算数组和增加了计算次数

     1     public int missingNumber(int[] nums) {
     2         // 数组下标无法达到n,因此这里初始化时就要赋值
     3         int sum=nums.length;
     4         for(int i=0;i<nums.length;i++){
     5             // 拆分实现高斯求和法中的等差数列求和操作
     6             sum+=i;
     7             sum-=nums[i];
     8         }
     9         return sum;
    10     }
    争取早日不再是一只菜鸡
  • 相关阅读:
    如何给swing加上alt+x和ctrl+x快捷键
    java基础之登录程序
    RFID UHF(EPC)标签使用常识
    史密斯圆图
    C# DataTable Operations
    温度测量【RTD】
    温度测量【温度传感器类型】
    C# Debug
    c# ComboBox绑定枚举
    c# 隐藏Tab控件的标签
  • 原文地址:https://www.cnblogs.com/jchen104/p/14582306.html
Copyright © 2011-2022 走看看