アルゴリズム:ダブルポインタ
6012 ワード
ダブルポインタアルゴリズム
1 Dアレイ内の2つの異なる要素を持つポインタを移動して、正しい答えを得ます.
モード
2つのポインタ
(start,end)
をそれぞれ0に設定して移動する.ex)
10 5
1 2 3 4 2 5 3 1 1 2 에서 5인 합 갯수 세기
left: 빨간색 ,right:
を青とし、right
を徐々に再生する.この地点では合計5を超えるため、
left
増加した.同様に、合が5の場合にカウントダウンを行い、
left
を増やす.この地点では合計5を超えるため、
left
増加した.同様に、合が5の場合にカウントダウンを行い、
left
を増やす.このように増加すると、
right
は終了します.これ以上はできないからです.コード#コード#
#include <cstdio>
using namespace std;
int main()
{
int n = 10; //n: 배열
int m = 5; //m : 합
int cnt = 0;
int s = 0;
int arr[] = {1, 2, 3, 4, 2, 5, 3, 1, 1, 2};
int left = 0, right = 0;
while (1)
{
if (s >= m)
s -= arr[left++];
else if (right == n)
break;
else
s += arr[right++];
if (s == m)
cnt++;
}
cout << cnt << '\n';
}
時間の複雑さ
ポインタの増加はnごとにしか増加しないので,配列の末尾に達すると終了する.
すなわち、時間的複雑度は
O(n)
である.スライドウィンドウ
配列またはリスト内の要素の一定範囲の値を比較する場合に有用なアルゴリズムです.
ダブルポインタとの違いは、どの瞬間でもその区間の幅が同じであることです.
ex)
10 5
1 2 3 4 2 5 3 1 1 2 에서 구간의 넓이가 [2]일 때, 최대 합을 구하여라
時間の複雑さ
同様に,時間複雑度は
O(n)
であった.ソース
https://m.blog.naver.com/kks227/220795165570
https://www.youtube.com/watch?v=uH9VJRIpIDY
Reference
この問題について(アルゴリズム:ダブルポインタ), 我々は、より多くの情報をここで見つけました https://velog.io/@song_lego/Algorithm투포인터Two-Pointerテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol