ダブルポインタ

3827 ワード

ダブルポインタ?


:リストに順次または連続的にアクセスする必要がある場合、2つのポイントを使用して位置を記録し、処理する方法.真ん中に1つを除外することはできません.
  • を参照
    https://www.youtube.com/watch?v=rI8NRQsAS_s&list=PLRx0vPvlEmdAZ6xXAUyBbLQa2-Ideakb-
  • 要害

  • 左はドア、右はドア、右はドア
    条件が必要です.rightのみ

    このベクトルで、連続する数列の和が5の場合、この数値はいくらですか?

  • 羅東彬のCode->これで行こう
  • using namespace std;
    
    int n = 5; // 데이터의 개수 N
    int m = 5; // 찾고자 하는 부분합 M
    int arr[] = {1, 2, 3, 2, 5}; // 전체 수열
    
    int main() {
        int cnt = 0;
        int intervalSum = 0;
        int end = 0;
    
        // start를 차례대로 증가시키며 반복
        for (int start = 0; start < n; start++) {
            // end를 가능한 만큼 이동시키기
            while (intervalSum < m && end < n) {
                intervalSum += arr[end];
                end += 1;
            }
            // 부분합이 m일 때 카운트 증가
            if (intervalSum == m) {
                cnt += 1;
            }
            intervalSum -= arr[start];
        }
    
        cout << cnt << '\n';
    }
  • 私のコード
  • #include <iostream>
    #include <vector>
    
    using namespace std;
    
    
    
    //5를 만들수 있는 연속 수열 만들기
    int main()
    {
    	//1,2,2는 포함되지 않는다. 연속되지 않으므로. 
    	vector<int>v = { 1,2,3,2,5 };
    	int target = 5;
    
    	int left = 0;
    	int right = 0;
    	int sum = v[right];
    	int answer = 0;
    
    	while (right < 5 && left <= right)
    	{
    		if (sum < target)
    		{
    			right++;
    			if (right >= 5)
    				break;
    			sum += v[right];
    		}
    		else if (sum == target)
    		{
    			answer++;
    			right++;
    			if (right >= 5)
    				break;
    			sum += v[right];
    		}
    		else
    		{
    			sum -= v[left];
    			left++;
    		}
    
    	}
    	cout << answer << endl;
    }
    
    

    コード実装を使用する場合

  • インデックスを表す2つの変数と
  • の値を加算するには、インデックスは同じでは加算できません.
  • 関連する問題


    https://www.acmicpc.net/workbook/view/3264
    練習するBrootForceファイルを参照してください.
    3問ある
    数の和2、部分和、少数の連続和.

    数の和



    ->問題を引き起こすコード.
    Baekjunでは通れますがsum+=v[right]部分では
    インデックスを超えると、問題が発生します.
    変更しましょう...
    保存値をもう1つ追加します.

    部分マージ

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
    	
    	int n, m;
    	cin >> n >> m;
    	
    	vector<int>v(n);
    
    	for (int i = 0; i < n; i++)
    	{
    		cin >> v[i];
    	}
    
    	int left = 0;
    	int right = 0;
    	int sum = 0;
    	int min = INT_MAX;
    
    	for (int left = 0; left < n; left++)
    	{
    		while (right < n && sum < m)
    		{
    			sum += v[right];
    			right += 1;
    		}
    		if (sum == m)
    		{
    			int temp = right - left;
    
    			if (temp < min)
    				min = temp;
    		}
    
    		sum -= v[left];
    
    	}
    
    	if (min == INT_MAX)
    		min = 0;
    
    	cout << min ;
    
    }