[leetcode 双周赛 11] 1228 等差数列中缺失的数字

1228 Missing Number In Arithmetic Progression 等差数列中缺失的数字

问题描述

有一个数组, 其中的值符合等差数列的数值规律, 也就是说:

  • 在?0 <= i < arr.length - 1?的前提下, arr[i+1] - arr[i]?的值都相等.

我们会从该数组中删除一个 既不是第一个不是最后一个的值, 得到一个新的数组??arr.

给你这个缺值的数组?arr, 请你帮忙找出被删除的那个数.

示例 1:

输入: arr = [5,7,11,13]
输出: 9
解释: 原来的数组是 [5,7,9,11,13].

示例 2:

输入: arr = [15,13,12]
输出: 14
解释: 原来的数组是 [15,14,13,12].

提示:

  • 3 <= arr.length <= 1000
  • 0 <= arr[i] <= 10^5

思路

  • 读题
    输入数组, 是个等差序列, 不过中间(除了首尾)缺了一个元素

    暴力枚举

  1. 通过首尾元素算出该等差序列的差值, (tail-first)/len
  2. 使用为2的窗口扫描整个数组, 选出前后两元素差值不等于之前整体差值的前一个元素
  3. 输出前一个元素+差值

代码实现

暴力法 使用窗口遍历整个数组

class Solution {
    public int missingNumber(int[] arr) {
        int len = arr.length;
        // first, last 首尾两元素
        int first = arr[0], last = arr[len-1];
        // 该等差序列的整体等差
        int sub = (last-first) / len;

        for (int i = 0; i < len-1; i++) {
            // 一个为2的窗口 [i, i+1]
            int cur = arr[i], next = arr[i+1];
            // System.out.printf("cur:%d next:%d n1:%d\n", cur, next, cur+sub);
            // 如何前后元素差值不为等差, 那么前一个元素+等差 就是缺失的元素
            if (cur+sub != next) {
                return cur+sub;
            }
        }

        return 0;
    }
}

原文地址:https://www.cnblogs.com/slowbirdoflsh/p/11736159.html

时间: 2024-10-08 19:08:34

[leetcode 双周赛 11] 1228 等差数列中缺失的数字的相关文章

LEETCODE - 1228【等差数列中缺失的数字】

C++: class Solution { public: int missingNumber(vector<int>& arr) { int subnum = abs(arr[1]-arr[0]) < abs(arr[2]-arr[1]) ? arr[1]-arr[0] : arr[2]-arr[1]; for(int i = 1; i < arr.size() ; ++ i){ if(arr[i] - arr[i-1] == 2 * subnum){ return ar

LeetCode双周赛10

Leetcode双周赛10 5079.三个有序数组的交集 给出三个均为 严格递增排列 的整数数组 arr1,arr2 和 arr3. 返回一个由 仅 在这三个数组中 同时出现 的整数所构成的有序数组. 示例: 输入: arr1 = [1,2,3,4,5], arr2 = [1,2,5,7,9], arr3 = [1,3,4,5,8] 输出: [1,5] 解释: 只有 1 和 5 同时在这三个数组中出现. 提示: 1 <= arr1.length, arr2.length, arr3.length

怎样查出连续数字中缺失的数字

今天遇到一个问题,是要从1-100中找到缺失的数字,而且是杂序排列,开始的时候确实有点懵,怎么弄啊,后来看了别人的idea,自己动手做了一下,在这里做个记录,大家有更好的意见,请回复啊 public class PaiXu { /** * @param args */ public static void main(String[] args) { int a[] = {1, 2, 5, 4, 6, 7, 8, 10}; int b[] = null; b = new int[10]; for

剑指offer-面试题53_2-0~n-1中缺失的数字-二分查找

/* 题目: 寻找递增数组0~n-1中缺失的数字. */ /* 思路: 变形二分法. */ #include<iostream> #include<cstring> #include<vector> #include<algorithm> #include<map> using namespace std; int getMissingNumber(vector<int> &A, int n){ int start = 0;

53 - II. 0~n-1中缺失的数字

面试题53 - II. 0-n-1中缺失的数字 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内.在范围0-n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字. 示例 1: 输入: [0,1,3] 输出: 2 示例 2: 输入: [0,1,2,3,4,5,6,7,9] 输出: 8 限制: 1 <= 数组长度 <= 10000 class Solution { public int missingNumber(int[] nums) { if

leetcode 双周赛9 找出所有行中最小公共元素

给你一个矩阵 mat,其中每一行的元素都已经按 递增 顺序排好了.请你帮忙找出在所有这些行中 最小的公共元素. 如果矩阵中没有这样的公共元素,就请返回 -1. 示例: 输入:mat = [[1,2,3,4,5],[2,4,5,8,10],[3,5,7,9,11],[1,3,5,7,9]] 输出:5 解法: 暴力解法  就是使用哈希记录每行 然后比较 代码 class Solution { public: unordered_map<int, int> umap[510]; int smalle

leetcode 双周赛 Biweekly Contest 6

最后一题比赛快结束的时候想到怎么做了(通过WA的数据猜出来的),比赛后10分钟做出来的.最终做了3题,时间1个小时左右吧. 1150. Check If a Number Is Majority Element in a Sorted Array 这道题理论应该用二分,但是数据量很小(1000),所以就直接暴力过了: class Solution { public: bool isMajorityElement(vector<int>& nums, int target) { int

leetcode 双周赛9 进击的骑士

一个坐标可以从 -infinity 延伸到 +infinity 的 无限大的 棋盘上,你的 骑士 驻扎在坐标为 [0, 0] 的方格里. 骑士的走法和中国象棋中的马相似,走 “日” 字:即先向左(或右)走 1 格,再向上(或下)走 2 格:或先向左(或右)走 2 格,再向上(或下)走 1 格. 每次移动,他都可以按八个方向之一前进. 现在,骑士需要前去征服坐标为 [x, y] 的部落,请你为他规划路线. 最后返回所需的最小移动次数即可.本题确保答案是一定存在的. 示例 1: 输入:x = 2,

leetcode-15双周赛-1287-有序数组中出现次数超过25%的元素

题目描述: 方法一:二分法 class Solution: def findSpecialInteger(self, arr: List[int]) -> int: span = len(arr)//4 + 1 for i in range(0,len(arr),span): a = bisect.bisect_left(arr,arr[i]) b = bisect.bisect_right(arr,arr[i]) if b - a >= span: return arr[i] return