列表 arr 由在范围 [1, n] 中的所有整数组成,并按严格递增排序。请你对 arr 应用下述算法:

  • 从左到右,删除第一个数字,然后每隔一个数字删除一个,直到到达列表末尾。
  • 重复上面的步骤,但这次是从右到左。也就是,删除最右侧的数字,然后剩下的数字每隔一个删除一个。
  • 不断重复这两步,从左到右和从右到左交替进行,直到只剩下一个数字。

给你整数 n ,返回 arr 最后剩下的数字。

示例 1:

输入:n = 9
输出:6
解释:
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
arr = [2, 4, 6, 8]
arr = [2, 6]
arr = [6]

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 109


解题思路


首先想到的是模拟,即按题目描述的步骤重复删除数字,直至剩下一个数字为止。实际操作时,由于数组元素只会出现1~n,所以只需要将待删除的数字置为0或一个负数即可,不必真正删除该数字。

上面的方式每次删除数字时需要遍历一轮数组,由于每次删除数组剩余元素的一半,所以一共需要删除 log2n 次,整体算法复杂度为O(nlogn)级别,考虑到n的数量级为109级别,算法极有可能超时。


















  • 无标签