2016-09-07 6 views
-2

Я пытался решить this небольшую проблему с LeetCode:Начало Индекс массива/элемент списка

-module(two_sum). 

-export([main/2]). 

-spec main(List :: list(), Target :: non_neg_integer()) -> list(). 

%%%================================================================== 
%%% Export 
%%%================================================================== 
main(List, Target) -> 
    P = [{string:str(List, [X]), string:str(List, [Y]), X + Y} || X <- List, Y <- List, Y > X andalso X + Y =:= Target], 
    io:format("Result: ~w~n", [P]). 
%%[X + Y || X <- List, Y <- List, Y > X]. 
%%iterate(List, Target, 0, {}). 

%%%================================================================== 
%%% Internal 
%%%================================================================== 
iterate([], _Target, _Sum, _Result) -> {}; 
iterate([H | T], Target, Sum, Result) -> 
    %%io:format("H >> ~w; T >> ~w, Target >> ~w~n", [H, T, Target]). 
    Acc = Sum + H, 
    case Acc =:= Target of 
    true -> erlang:append_element(Result, H); 
    false -> iterate(T, Target, Acc, Result) 
    end. 

Мои вопросы:

  1. Есть ли более эффективный способ, чтобы получить индекс элемента из массив/список? В настоящее время я использую это: {string:str(List, [X]), но я не уверен, что это правильно, хотя он выполняет свою работу.
  2. Если мне случится, например, получить такой результат: R = [{1,2,9},{1,3,13},{1,4,17},{2,3,18},{2,4,22},{3,4,26}], как мне сопоставить шаблон для {1,2,9}, зная, что 9 - Target? Я пробовал [{X1, X2, Target}] = R ... но ему это не понравилось!
+2

Если вы охарактеризовали «постановка задачи» в этом вопросе, и объяснить свой алгоритм на языке агностиком псевдокоде, то есть лучший шанс для вас, чтобы получить ответ (предполагая, что ваш вопрос касается алгоритма, а не конкретной функции языка). –

+0

У меня нет вопросов. Более эффективный путь от чего? И, кстати, я считаю, что ваш алгоритм работает неправильно. –

ответ

1

Как насчет этого. Для каждого элемента проверяйте его сумму с каждым последующим элементом в списке, переносящим по двум индексам, который будет использоваться для сообщения пользователю, если совпадение найдено.

find_indices(Target, [_H | T] = L) -> 
    find_indices(Target, L, T, 0, 1). 


find_indices(_Target, [_], [], _I, _J) -> 
    io:format("No match~n"); 

find_indices(Target, [_Curr | LeftRest], [], I, _J) -> 
    find_indices(Target, LeftRest, tl(LeftRest), I + 1, I + 2); 

find_indices(Target, [Curr | _LeftRest], [Other | _RightRest], I, J) 
    when Target =:= Curr + Other -> 
    io:format("Match at indices ~p and ~p: ~p + ~p = ~p~n", 
    [I, J, Curr, Other, Target]), 
    ok; 

find_indices(Target, L, [_Other | RightRest], I, J) -> 
    find_indices(Target, L, RightRest, I, J + 1). 

Пример:

1> index:find_indices(7, [1,2,3,4,5,6]). 
Match at indices 2 and 3: 3 + 4 = 7 
ok 
2> index:find_indices(11, [1,2,3,4,5,6]). 
Match at indices 4 and 5: 5 + 6 = 11 
ok 
3> index:find_indices(12, [1,2,3,4,5,6]). 
No match 
ok 
4> index:find_indices(4, [1,2,3,4,5,6]). 
Match at indices 0 and 2: 1 + 3 = 4 
ok 
Смежные вопросы