首页 > 试题广场 >

第二大的数

[编程题]第二大的数
  • 热度指数:4123 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解
输入n个整数,查找数组中第二大的数

输入描述:
第一行n表示n个数,第二行n个空格隔开的数


输出描述:
输出第二大的数
示例1

输入

5
1 2 3 4 5

输出

4
经典题,快速选择秒了。测试用例有个n = 12的挺有问题的,我干脆直接用数组长度得了。

class MainActivity:

    def main(self):
        # Read the data
        n = int(input())
        nums = list(map(int, filter(lambda x: len(x) > 0, input().split(' '))))
        # Get the result
        result = self.__quickSelect(nums, 2, 0, len(nums) - 1)
        print(result)
    
    def __quickSelect(self, nums, k, start, end):
        # Initialization
        leftPtr = start
        rightPtr = end
        pivot = nums[leftPtr]
        status = True
        # Traverse
        while leftPtr < rightPtr:
            if status:
                if nums[rightPtr] < pivot:
                    nums[leftPtr] = nums[rightPtr]
                    leftPtr += 1
                    status = False
                else:
                    rightPtr -= 1
            else:
                if nums[leftPtr] > pivot:
                    nums[rightPtr] = nums[leftPtr]
                    rightPtr -= 1
                    status = True
                else:
                    leftPtr += 1
        nums[leftPtr] = pivot
        # Judge
        if end - k + 1 == leftPtr:
            return pivot
        else:
            if leftPtr < end - k + 1:
                return self.__quickSelect(nums, k, leftPtr + 1, end)
            else:
                usedNums = end - leftPtr + 1
                return self.__quickSelect(nums, k - usedNums, start, leftPtr - 1)


if __name__ == '__main__':
    M = MainActivity()
    M.main()
发表于 2024-08-24 14:28:58 回复(0)