给定一个由N 个整数组成的数组arr[]和数字K ,任务是在arr[] 中找到K的最后一次出现。如果元素不存在,则返回-1 。
例子:
Input: arr[] = {1, 3, 4, 2, 1, 8}, K = 1
Output: 4
Explanation:
There are two occurrence of 1 at index 0 and 4. But the last occurrence is at index 4.
Input: arr[] = {3, 4, 5, 6, 7}, K = 2
Output: -1
Explanation:
Since 2 is not present in the array.
方法一:使用递归
- 从给定数组的最后一个索引递归迭代:
- 基本情况:如果我们递归地到达起始索引,则意味着给定的元素K不存在于数组中。
if(idx < 0) {
return -1;
}
- 返回语句:如果递归调用中的当前元素等于K ,则从函数返回当前索引。
if(arr[idx]==K) {
return idx;
}
- 递归调用:如果当前索引处的元素不等于K ,则递归调用下一次迭代。
return recursive_function(arr, idx - 1)
下面是上述方法的实现:
CPP
// C++ program for the above approach
#include
using namespace std;
// Recursive function to find the last
// index of the given number K
int findIndex(int arr[], int idx, int K)
{
// Base Case
if (idx < 0)
return -1;
// Return Statement
if (arr[idx] == K) {
return idx;
}
// Recursive Call
return findIndex(arr, idx - 1, K);
}
// Driver Code
int main()
{
int arr[] = { 3, 1, 4, 4, 2, 3, 1 };
int N = sizeof(arr) / sizeof(arr[0]);
int K = 4;
// Function call
cout << findIndex(arr, N - 1, K);
return 0;
}
C++
// C++ program for the above approach
#include
using namespace std;
// Function to find the last index of
// the given number K
int findIndex(int arr[], int N, int K)
{
// Reverse the given array arr[]
reverse(arr, arr + N);
// Find the first occurrence of K
// in this reversed array
auto it = find(arr, arr + N, K);
// If the element is not present
// then return "-1"
if (it == arr + N) {
return -1;
}
// Else return the index found
return (N - distance(arr, it) - 1);
}
// Driver Code
int main()
{
int arr[] = { 3, 1, 4, 4, 2, 3, 1 };
int N = sizeof(arr) / sizeof(arr[0]);
int K = 4;
// Function call
cout << findIndex(arr, N, K);
return 0;
}
C++
// C++ program for the above approach
#include
using namespace std;
// Comparator structure for finding
// index of element with value K
struct comparator {
int elem;
comparator(int const& i)
: elem(i)
{
}
bool operator()(int const& i)
{
return (i == elem);
}
};
// Function to find the last index of
// the given number K
int findIndex(int arr[], int N, int K)
{
// Reverse the given array arr[]
reverse(arr, arr + N);
// Find the first occurrence of K
// in this reversed array
auto it = find_if(arr, arr + N,
comparator(K));
// If the element is not present
// then return "-1"
if (it == arr + N) {
return -1;
}
// Else return the index found
return (N - distance(arr, it) - 1);
}
// Driver Code
int main()
{
int arr[] = { 3, 1, 4, 4, 2, 3, 1 };
int N = sizeof(arr) / sizeof(arr[0]);
int K = 4;
// Function call
cout << findIndex(arr, N, K);
return 0;
}
C++
// CPP program for the above approach
#include
using namespace std;
int findIndex(int arr[], int idx, int K)
{
// Traversing the array from
// last position
for (int i = idx; i >= 0; i--) {
if (arr[i] == K)
return i;
}
return -1;
}
// Driver Code
int main()
{
int arr[] = { 3, 1, 4, 4, 2, 3, 1 };
int N = sizeof(arr) / sizeof(arr[0]);
int K = 4;
// Function call
cout << findIndex(arr, N - 1, K);
return 0;
}
输出:
3
时间复杂度: O(N),其中 N 是数组的长度。
方法二:使用inbuit函数find()和find_if():
思路是从数组的末尾找到第一个元素,从数组的开头找到最后一个元素。以下是步骤:
- 反转给定的数组。
- 使用 find()函数在反向数组中找到值K的第一个元素。
- 如果 find函数返回的迭代器指向数组的末尾,则该元素不存在于数组中。
- 否则使用 distance()函数在这个反向数组中找到K的位置(比如pos )。
- 要获得给定数组中 K 的最后一个索引的距离,请打印(N – pos – 1) 。
下面是上述方法的实现:
使用 find()
C++
// C++ program for the above approach
#include
using namespace std;
// Function to find the last index of
// the given number K
int findIndex(int arr[], int N, int K)
{
// Reverse the given array arr[]
reverse(arr, arr + N);
// Find the first occurrence of K
// in this reversed array
auto it = find(arr, arr + N, K);
// If the element is not present
// then return "-1"
if (it == arr + N) {
return -1;
}
// Else return the index found
return (N - distance(arr, it) - 1);
}
// Driver Code
int main()
{
int arr[] = { 3, 1, 4, 4, 2, 3, 1 };
int N = sizeof(arr) / sizeof(arr[0]);
int K = 4;
// Function call
cout << findIndex(arr, N, K);
return 0;
}
使用 find_if()
C++
// C++ program for the above approach
#include
using namespace std;
// Comparator structure for finding
// index of element with value K
struct comparator {
int elem;
comparator(int const& i)
: elem(i)
{
}
bool operator()(int const& i)
{
return (i == elem);
}
};
// Function to find the last index of
// the given number K
int findIndex(int arr[], int N, int K)
{
// Reverse the given array arr[]
reverse(arr, arr + N);
// Find the first occurrence of K
// in this reversed array
auto it = find_if(arr, arr + N,
comparator(K));
// If the element is not present
// then return "-1"
if (it == arr + N) {
return -1;
}
// Else return the index found
return (N - distance(arr, it) - 1);
}
// Driver Code
int main()
{
int arr[] = { 3, 1, 4, 4, 2, 3, 1 };
int N = sizeof(arr) / sizeof(arr[0]);
int K = 4;
// Function call
cout << findIndex(arr, N, K);
return 0;
}
输出:
3
时间复杂度: O(N) ,其中 N 是给定数组中的元素数。
方法三:(迭代方式)
使用循环查找最后一个位置。
下面是上述方法的实现
C++
// CPP program for the above approach
#include
using namespace std;
int findIndex(int arr[], int idx, int K)
{
// Traversing the array from
// last position
for (int i = idx; i >= 0; i--) {
if (arr[i] == K)
return i;
}
return -1;
}
// Driver Code
int main()
{
int arr[] = { 3, 1, 4, 4, 2, 3, 1 };
int N = sizeof(arr) / sizeof(arr[0]);
int K = 4;
// Function call
cout << findIndex(arr, N - 1, K);
return 0;
}
输出:
3
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live