ダブルポインタ
3827 ワード
ダブルポインタ?
:リストに順次または連続的にアクセスする必要がある場合、2つのポイントを使用して位置を記録し、処理する方法.真ん中に1つを除外することはできません.
https://www.youtube.com/watch?v=rI8NRQsAS_s&list=PLRx0vPvlEmdAZ6xXAUyBbLQa2-Ideakb-
要害
条件が必要です.right
このベクトルで、連続する数列の和が5の場合、この数値はいくらですか?
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;
}
コード実装を使用する場合
関連する問題
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 ;
}
Reference
この問題について(ダブルポインタ), 我々は、より多くの情報をここで見つけました
https://velog.io/@kwt0124/투포인터-카카오-보석쇼핑
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
->問題を引き起こすコード.
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 ;
}
Reference
この問題について(ダブルポインタ), 我々は、より多くの情報をここで見つけました
https://velog.io/@kwt0124/투포인터-카카오-보석쇼핑
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
#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 ;
}
Reference
この問題について(ダブルポインタ), 我々は、より多くの情報をここで見つけました https://velog.io/@kwt0124/투포인터-카카오-보석쇼핑テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol