점차적으로 정렬된 수조와 숫자 S를 입력하고 수조에서 두 개의 수를 찾으면 그들의 합이 바로 S이다. 만약에 숫자의 합이 S와 같으면 두 개의 곱셈이 가장 작은 것을 출력한다.출력 설명: 각 테스트 사례에 대응하여 두 개의 수를 출력하고 작은 선출력을 출력합니다.
출력 설명:
, , 。
1. 폭력법 범람: (accept) 이해하기 쉽고 올라오면 폭력적이다. 시간의 복잡도 요구가 없으면 직접 이렇게 할 수 있다. 논리가 명확하고 빨리 쓸 수 있다.
import java.util.ArrayList;
import java.util.List;
public class Solution {
public ArrayList FindNumbersWithSum(int [] array,int sum) {
ArrayList list = new ArrayList();
String two_int = new String();
int min_Mul = Integer.MAX_VALUE;
for(int i = 0; i < array.length; i++)
for(int j = array.length-1; j > i; j--)
{
if((array[i] + array[j] == sum)&&(array[i] * array[j] < min_Mul))
{
two_int = "";
two_int = String.valueOf(array[i]) +" "+String.valueOf(array[j]);
min_Mul = array[i] * array[j];
break;
}
}
if(two_int.length() == 0)
return list;
String[] strarr = two_int.split(" ");
list.add(Integer.parseInt(strarr[0]));
list.add(Integer.parseInt(strarr[1]));
return list;
}
}
2. 좌우로 협박하는 방법을 통해 시간의 복잡도는 O(n)이고 이해하기 쉽지만 폭력적인 방법은 쉽게 생각할 수 없다(블로거와 같은 작은 찌꺼기는 많이 보고 축적해야 한다)
링크:https://www.nowcoder.com/questionTerminal/390da4f7a00f44bea7c2f3d19491311b소 그물
수열은 증가를 만족시키고 두 개의 머리와 꼬리, 두 개의 지침 i와 j를 설정한다.
만약ai+aj==sum이면 답이다(차이가 클수록 곱셈이 작다)
만약ai+aj>sum,aj는 틀림없이 답안 중의 하나가 아닐 것이다(앞에서 이미 i가 나온 앞의 수는 이미 불가능하다),j-=1
만약ai+aj
찾은 첫 번째 조는 곱셈이 가장 작은 것이다.이렇게 증명할 수 있다. x+y=C(C는 상수), x*y의 크기를 고려한다.y>=x, y-x=d>=0, 즉 y=x+d, 2x+d=C, x=(C-d)/2, x*y=x(x+d)=(C-d)(C+d)/4=(C^2-d^2)/4, 즉 x*y는 변수 d에 관한 2차 함수로 대칭축은 y축이고 입구는 아래로 향한다.d는 >=0이고 d가 클수록 x*y도 작아진다.
코드:
import java.util.ArrayList;
import java.util.List;
public class Solution {
public ArrayList FindNumbersWithSum(int [] array,int sum) {
ArrayList list = new ArrayList();
if (array == null || array.length < 2)
return list;
for(int i = 0, j = array.length-1; i < j; )
{
if(array[i]+array[j]==sum)
{
list.add(array[i]);
list.add(array[j]);
return list;
}
else if(array[i]+array[j]>sum)
j--;
else{
i++;
}
return list;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.