LeetCode 479 - Largest Palindrome Product - Hard ( Python)
Posted sky37
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 479 - Largest Palindrome Product - Hard ( Python)相关的知识,希望对你有一定的参考价值。
Find the largest palindrome made from the product of two n-digit numbers.
Since the result could be very large, you should return the largest palindrome mod 1337.
Example:
Input: 2
Output: 987
Explanation: 99 x 91 = 9009, 9009 % 1337 = 987
Note:
The range of n is [1,8].
题意:给一个digit的位数,找出由两个这个位数组成的digit相乘的最大palindrome的数字。
思路:假设我们得到的res = m * l。由m和n这两个数字组成。同时我们可以发现所有的答案还满足一个pattern: 10 ** n * upper + lower.
以及如果在得到答案的时候,m和n两个数字基本都会尽可能接近10**n。那么我们假设m=10**n-i, l = 10 ** n - j. (注意不是加,不然的话,m和l就是超过n位数的了)。把m和l的表达式代到res中,我们可以得到res = 10**N (10**N-i-j)+ i*j = 10**N*upper + lower。 令i+j = a, 那么i*j = a*i - i*i。
我们对a 进行range(2, 9*10**(n-1))的遍历。(因为i 大于等于1,j大于等于1,所以a至少为2)。在a的遍历过程中,计算upper的值为10**N-a, lower=int(str(upper)[::-1)。 暂时不是很明白为什么等于这个。因为low = a*i-i**i. 所以(i-a/2)^2 = (a^2-4*low)/4. 等号前是一个整数,那么我们只需要找到第一个a^2-4*low为整数的值,即为所求的a的值,从而得到最终的答案。(因为upper是10^N-a,所以a越小,最终的答案越大。
class Solution: def largestPalindrome(self, n: int) -> int: if n == 1: return 9 for a in range(2, 9*10**(n-1)): upper = (10 ** n) -a low = int(str(upper)[::-1]) if (a ** 2 - 4 * low) < 0: continue if (a**2 - 4*low)** 0.5 == int((a**2 - 4*low)**0.5): if (a**2-4*lo)**.5 == int((a**2-4*lo)**.5): return (low+10**n*(10**n-a))%1337
以上是关于LeetCode 479 - Largest Palindrome Product - Hard ( Python)的主要内容,如果未能解决你的问题,请参考以下文章
479. Largest Palindrome Product
479. Largest Palindrome Product
easy479. Largest Palindrome Product