leetcodeOJ 306: Additive Number

题目来源:https://leetcode.com/problems/additive-number/description/

Additive number is a string whose digits can form additive sequence.

A valid additive sequence should contain at least three numbers. Except for the first two numbers, each subsequent number in the sequence must be the sum of the preceding two.

For example:
“112358” is an additive number because the digits can form an additive sequence: 1, 1, 2, 3, 5, 8.

1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8
“199100199” is also an additive number, the additive sequence is: 1, 99, 100, 199.
1 + 99 = 100, 99 + 100 = 199
Note: Numbers in the additive sequence cannot have leading zeros, so sequence 1, 2, 03 or 1, 02, 3 is invalid.

Given a string containing only digits ‘0’-‘9’, write a function to determine if it’s an additive number.

Follow up:
How would you handle overflow for very large input integers?

为了方便处理大整数,利用java中的BigInteger类,及相关函数

代码如下:

import java.math.BigInteger;//别忘了这一句,不然会出错

class Solution {
    public boolean isAdditiveNumber(String num) {
        int n = num.length();
        for(int i = 1; i <= n/2; ++i){
            if(i > 1 && num.charAt(0) == '0')
                return false;
            BigInteger num1 = new BigInteger(num.substring(0, i));
            for(int j = 1; Math.max(i, j) <= n-i-j; ++j){//注意结束条件
                if(j > 1 && num.charAt(i) == '0') //数字以0开头,类似03、02这种,要考虑在内
                    break;
                BigInteger num2 = new BigInteger(num.substring(i, i+j));
                if(isValid(num, num1, num2, i+j))
                    return true;                
            }
        }

        return false;
    }

    public boolean isValid(String num, BigInteger num1, BigInteger num2, int pos){
        if(pos == num.length())
            return true;

        num2 = num2.add(num1);
        num1 = num2.subtract(num1);

        String str = num2.toString();
        return num.startsWith(str, pos) && isValid(num, num1, num2, pos+str.length());                          
    }
}
### 回答1: ArcFace是一种用于深度人脸识别的加性角度边界损失函数。它通过将人脸特征向量映射到一个高维球面空间中,来实现对人脸的准确识别。该方法在LFW、CFP和MegaFace等公共数据集上都取得了非常好的效果。 ### 回答2: ARC Face是一种深度人脸识别中用于改善性能的技术。它是一种针对原始Softmax损失函数的改进,旨在提高神经网络的识别度和准确性。 在传统的训练过程中,Softmax交叉熵损失函数用于训练神经网络,以使其对于每个身份有一个相应的输出。然而,这种方法对于复杂的人脸认证任务来说往往无法满足要求,因为它无法有效地区分相似人脸。因此,ARC Face损失函数在Softmax之上引入了一个加法角度间隔,并通过控制不同类别之间的间隔来提高网络的鉴别度和泛化能力。 通过加入额外的角度余弦项,ARC Face能够通过增加类别之间的间隔来增强模型的辨别力。这种损失函数的实现非常简单:对于每个数据点,它计算一个基本的Softmax损失,并在其之上添加一个额外的角度间隔,以确保相似人脸的辨别度足够高。因此,它可以很轻松地集成到任何现有的深度学习框架中。 另外,ARC Face的优点还包括它能够自适应调整当前的角度间隔,以确保其最大化对不同类别的特征表示的区分度。这使得ARC Face能够以更高的准确性从更小的数据集中进行训练,并因此需要更少的数据就能获得更好的性能。 总而言之,ARC Face是一种在深度人脸识别中广泛使用的技术,它通过在Softmax损失函数之上引入额外的角度间隔来增强模型的辨别力和泛化能力。这使得网络能够更好地区分相似人脸,从而提高了对复杂识别任务的性能。 ### 回答3: Arcface是一种深度人脸识别算法,是在原本的softmax分类器上加入了一项angular margin loss。此项损失函数在训练时能够直接优化人脸特征的分类聚合性,能够使得特征向量之间的欧氏距离与余弦相似性更加明显。 首先, Arcface对于标准的softmax分类器进行了改良,其中加入了一个角度边界的约束项。这个约束项可以调整样本的特征分布,以更好地区分不同的个体,从而提升模型的人脸识别精度。其中,角度边界的大小可以通过超参数进行调整。在正常的softmax分类器中,每个样本都被分类到一个特定的人脸类别中,而在Arcface中,每个样本都被分配到一个角度上。 其次,Arcface使用了余弦相似性来刻画不同的人脸特征之间的距离,这种距离度量方式更加适合高维特征向量的表达。余弦相似性一般값介于0和1之间,其值越高说明这两个特征向量越相似,相反,则说明它们越不相似。Arcface算法使用余弦距离来优化分类效果,这对于人脸识别任务来说是非常重要的,尤其是当特征向量非常长时。 最后,Arcface还使用了梯度下降来最小化损失函数,并通过不断调整超参数来优化算法的性能。除此之外,Arcface还采用一些常用的技术来提高算法的性能,比如数据增强以及批处理学习等等。 总之,Arcface采用了一种新的损失函数设计以及有效的余弦相似度度量方法,优化了人脸识别问题,大大提升了特征向量的可表示性,并在现实场景中应用广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值