First strictly smaller element in a sorted array in Java
Last Updated :
23 Feb, 2023
Given a sorted array and a target value, find the first element that is strictly smaller than the given element.
Examples:
Input : arr[] = {1, 2, 3, 5, 8, 12}
Target = 5
Output : 2 (Index of 3)
Input : {1, 2, 3, 5, 8, 12}
Target = 8
Output : 3 (Index of 5)
Input : {1, 2, 3, 5, 8, 12}
Target = 15
Output : 5 (Index of 12)
Input : {1, 2, 3, 5, 8, 12}
Target = 1
Output : -1
Input : {1}
Target = 1
Output : -1
Input : { }
Target = 1
Output : -1
A simple solution is to linearly traverse given array and find first element that is strictly greater. If no such element exists, then return -1.
Below is the implementation for the above approach:
C++
// CPP program to find index of first strictly smaller
// element in a sorted integer array of a given element
// Using Linear Search
#include <bits/stdc++.h>
int findFirstStrictlySmaller(const std::vector<int>& arr,
int x)
{
for (int i = arr.size() - 1; i >= 0; i--) {
if (arr[i] < x) {
return i;
}
}
return -1;
}
int main()
{
int x, index;
// Find the first strictly smaller element in a sorted
// array of integers.
std::vector<int> arr1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
x = 6;
index = findFirstStrictlySmaller(arr1, x);
std::cout << index << std::endl;
// Find the first strictly smaller element in an array
// with a single element.
std::vector<int> arr2 = { 1 };
x = 1;
index = findFirstStrictlySmaller(arr2, x);
std::cout << index << std::endl;
// Find the first strictly smaller element in an empty
// array.
std::vector<int> arr3;
x = 1;
index = findFirstStrictlySmaller(arr3, x);
std::cout << index << std::endl;
return 0;
}
// This code is contributed by Susobhan Akhuli
Java
// Java program to find index of first strictly smaller
// element in a sorted integer array of a given element
// Using Linear Search
public class GFG {
public static int findLastStrictlySmaller(int[] arr,
int x)
{
for (int i = arr.length - 1; i >= 0; i--) {
if (arr[i] < x) {
return i;
}
}
return -1;
}
public static void main(String[] args)
{
int x, index;
// Find the first strictly smaller element in a
// sorted array of integers
int[] arr1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
x = 6;
index = findLastStrictlySmaller(arr1, x);
System.out.println(index); // Output: 4
// Find the first strictly smaller element in an
// array with a single element
int[] arr2 = { 1 };
x = 1;
index = findLastStrictlySmaller(arr2, x);
System.out.println(index); // Output: -1
// Find the first strictly smaller element in an
// empty array
int[] arr3 = {};
x = 1;
index = findLastStrictlySmaller(arr3, x);
System.out.println(index); // Output: -1
}
}
// This code is contributed by Susobhan Akhuli
Python3
# Python program to find index of first strictly smaller
# element in a sorted integer array of a given element
# Using Linear Search
def findFirstStrictlySmaller(arr, x):
# Iterate through the list in reverse order, starting from the last element.
for i in range(len(arr)-1, -1, -1):
# If the current element is strictly smaller than 'x', return its index.
if arr[i] < x:
return i
# If no strictly smaller element is found, return -1.
return -1
# Find the first strictly smaller element in a sorted list of integers.
arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
x = 6
index = findFirstStrictlySmaller(arr1, x)
print(index)
# Find the first strictly smaller element in a list with a single element.
arr2 = [1]
x = 1
index = findFirstStrictlySmaller(arr2, x)
print(index)
# Find the first strictly smaller element in an empty list.
arr3 = []
x = 1
index = findFirstStrictlySmaller(arr3, x)
print(index)
# This code is contributed by Susobhan Akhuli
C#
// C# program to find index of first strictly smaller
// element in a sorted integer array of a given element
// Using Linear Search
using System;
public class GFG {
static int findFirstStrictlySmaller(int[] arr, int x)
{
for (int i = arr.Length - 1; i >= 0; i--) {
if (arr[i] < x) {
return i;
}
}
return -1;
}
public static void Main()
{
int x, index;
// Find the first strictly smaller element in a
// sorted array of integers.
int[] arr1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
x = 6;
index = findFirstStrictlySmaller(arr1, x);
Console.WriteLine(index);
// Find the first strictly smaller element in an
// array with a single element.
int[] arr2 = { 1 };
x = 1;
index = findFirstStrictlySmaller(arr2, x);
Console.WriteLine(index);
// Find the first strictly smaller element in an
// empty array.
int[] arr3 = {};
x = 1;
index = findFirstStrictlySmaller(arr3, x);
Console.WriteLine(index);
}
}
// This code is contributed by Susobhan Akhuli
JavaScript
// JavaScript program to find index of first strictly smaller
// element in a sorted integer array of given element
// using Linear Search
// THIS CODE IS CONTRIBUTED BY KIRTI AGARWAL(KIRTIAGARWAL23121999)
function findFirstStrictlySmaller(arr, x){
// iterate through the list in reverse order, starting from the last element
for(let i = arr.length-1; i>=0; i--){
if(arr[i] < x) return i;
}
return -1;
}
// driver program to test above function
let x, index;
// find the first strictly smaller element in a sorted
// array of integer
let arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
x = 6;
index = findFirstStrictlySmaller(arr1, x);
console.log(index);
// find the first strictly smaller element in an array
// with a single element
let arr2 = [1];
x = 1;
index = findFirstStrictlySmaller(arr2, x);
console.log(index);
// find the first strictly smaller element in an empty
// with a single element
let arr3 = [];
x = 1;
index = findFirstStrictlySmaller(arr3, x);
console.log(index);
Time Complexity: O(N), for linear searching a list of N elements.
Auxiliary Space: O(1), because it only uses constant amounts of space for its variables.
An efficient solution is to use Binary Search. In a general binary search, we are looking for a value that appears in the array. Sometimes, however, we need to find the first element which is either greater than a target.
To see that this algorithm is correct, consider each comparison being made. If we find an element that’s greater than the target element, then it and everything above it can’t possibly match, so there’s no need to search that region. We can thus search the left half. If we find an element that is smaller than the element in question, then anything before it must also be larger, so they can’t be the first element that’s smaller and so we don’t need to search them. The middle element is thus the last possible place it could be.
Note that on each iteration we drop off at least half the remaining elements from consideration. If the top branch executes, then the elements in the range [low, (low + high) / 2] are all discarded, causing us to lose floor((low + high) / 2) - low + 1 >= (low + high) / 2 - low = (high - low) / 2 elements.
If the bottom branch executes, then the elements in the range [(low + high) / 2 + 1, high] are all discarded. This loses us high - floor(low + high) / 2 + 1 >= high - (low + high) / 2 = (high - low) / 2 elements.
Consequently, we'll end up finding the first element smaller than the target in O(lg n) iterations of this process.
Implementation:
C++
// C++ program to find first element that
// is strictly smaller than given target.
#include<bits/stdc++.h>
using namespace std;
int next(int arr[], int target, int end)
{
// Minimum size of the array should be 1
if(end == 0) return -1;
// If target lies beyond the max element, than the index of strictly smaller
// value than target should be (end - 1)
if (target > arr[end - 1]) return end-1;
int start = 0;
int ans = -1;
while (start <= end)
{
int mid = (start + end) / 2;
// Move to the left side if the target is smaller
if (arr[mid] >= target)
{
end = mid - 1;
}
// Move right side
else
{
ans = mid;
start = mid + 1;
}
}
return ans;
}
// Driver code
int main()
{
int arr[] = { 1, 2, 3, 5, 8, 12 };
int n = sizeof(arr)/sizeof(arr[0]);
cout << (next(arr, 5, n));
return 0;
}
// This code is contributed by d-dalal
Java
// Java program to find first element that
// is strictly smaller than given target.
class GfG {
private static int next(int[] arr, int target)
{
int start = 0, end = arr.length-1;
// Minimum size of the array should be 1
if(end == 0) return -1;
// If target lies beyond the max element, than the index of strictly smaller
// value than target should be (end - 1)
if (target > arr[end]) return end;
int ans = -1;
while (start <= end) {
int mid = (start + end) / 2;
// Move to the left side if the target is smaller
if (arr[mid] >= target) {
end = mid - 1;
}
// Move right side
else {
ans = mid;
start = mid + 1;
}
}
return ans;
}
// Driver code
public static void main(String[] args)
{
int[] arr = { 1, 2, 3, 5, 8, 12 };
System.out.println(next(arr, 5));
}
}
Python3
# Python3 program to find first element that
# is strictly smaller than given target
def next(arr, target):
start = 0;
end = len(arr) - 1;
# Minimum size of the array should be 1
if (end == 0):
return -1;
'''
If target lies beyond the max element, than the index of strictly smaller
value than target should be (end - 1)
'''
if (target > arr[end]):
return end;
ans = -1;
while (start <= end):
mid = (start + end) // 2;
# Move to the left side if target is
# smaller
if (arr[mid] >= target):
end = mid - 1;
# Move right side
else:
ans = mid;
start = mid + 1;
return ans;
# Driver code
if __name__ == '__main__':
arr = [ 1, 2, 3, 5, 8, 12 ];
print(next(arr, 5));
# This code is contributed by d-dalal
C#
// C# program to find first element that
// is strictly smaller than given target.
using System;
class GfG {
private static int next(int[] arr, int target)
{
int start = 0, end = arr.Length-1;
// Minimum size of the array should be 1
if(end == 0) return -1;
// If target lies beyond the max element, than the index of strictly smaller
// value than target should be (end - 1)
if (target > arr[end]) return end;
int ans = -1;
while (start <= end) {
int mid = (start + end) / 2;
// Move to the left side if the target is smaller
if (arr[mid] >= target) {
end = mid - 1;
}
// Move right side
else {
ans = mid;
start = mid + 1;
}
}
return ans;
}
// Driver code
public static void Main()
{
int[] arr = { 1, 2, 3, 5, 8, 12 };
Console.WriteLine(next(arr, 5));
}
}
// This code is contributed by d-dalal.
PHP
<?php
// PHP program to find first element that
// is strictly smaller than given target.
function next0($arr, $target)
{
$start = 0; $end = sizeof($arr)-1;
// Minimum size of the array should be 1
if($end == 0) return -1;
// If target lies beyond the max element, than the index of strictly smaller
// value than target should be (end - 1)
if ($target > $arr[$end]) return $end;
$ans = -1;
while ($start <= $end)
{
$mid =(int)(($start + $end) / 2);
// Move to the left side if the target is smaller
if ($arr[$mid] >= $target)
{
$end = $mid - 1;
}
// Move right side
else
{
$ans = $mid;
$start = $mid + 1;
}
}
return $ans;
}
// Driver code
{
$arr = array(1, 2, 3, 5, 8, 12 );
echo(next0($arr, 5));
}
// This code is contributed by d-dalal.
JavaScript
<script>
function next(arr, target, end)
{
// Minimum size of the array should be 1
if(end == 0) return -1;
// If target lies beyond the max element, than the index of strictly smaller
// value than target should be (end - 1)
if (target > arr[end - 1]) return end-1;
let start = 0;
let ans = -1;
while (start <= end)
{
let mid = (start + end) / 2;
// Move to the left side if the target is smaller
if (arr[mid] >= target)
{
end = mid - 1;
}
// Move right side
else
{
ans = mid;
start = mid + 1;
}
}
return ans;
}
let arr = [ 1, 2, 3, 5, 8, 12 ];
let n = arr.length;
console.log(next(arr, 5, n));
// This code is contributed by akashish__
</script>
Time Complexity: O(log n), Where n is the number of elements in the array.
Auxiliary Space: O(1)
Additional Methods:
1. Iterative binary search: This method is similar to the binary search method I provided earlier, but it uses an iterative approach rather than a recursive one. The basic idea is to use a loop to repeatedly divide the list in half, until the desired element is found or it is clear that the element is not present in the list.
def find_first_strictly_smaller(arr, x):
left = 0
right = len(arr) - 1
result = -1
while left <= right:
mid = left + (right - left) // 2
if arr[mid] < x:
result = mid
left = mid + 1
else:
right = mid - 1
return result
Time Complexity: O(log n), Where n is the number of elements in the array.
Auxiliary Space: O(1)
2. Reverse iterative binary search: This method is similar to the iterative binary search method, but it iterates through the list in reverse order, starting from the last element. This allows it to find the last smaller element in the list, rather than the first one which is first strictly smaller.
def find_first_strictly_smaller(arr, x):
left = 0
right = len(arr) - 1
while left <= right:
mid = right - (right - left) // 2
if arr[mid] < x:
left = mid + 1
else:
right = mid - 1
if right >= 0 and arr[right] < x:
return right
return -1
Time Complexity: O(log n), Where n is the number of elements in the array.
Auxiliary Space: O(1)
Similar Reads
First strictly greater element in a sorted array in Java
Given a sorted array and a target value, find the first element that is strictly greater than given element. Examples: Input : arr[] = {1, 2, 3, 5, 8, 12} Target = 5 Output : 4 (Index of 8) Input : {1, 2, 3, 5, 8, 12} Target = 8 Output : 5 (Index of 12) Input : {1, 2, 3, 5, 8, 12} Target = 15 Output
6 min read
Java Program to Find Largest Element in an Array
Finding the largest element in an array is a common programming task. There are multiple approaches to solve it. In this article, we will explore four practical approaches one by one to solve this in Java.Example Input/Output:Input: arr = { 1, 2, 3, 4, 5}Output: 5Input: arr = { 10, 3, 5, 7, 2, 12}Ou
4 min read
How to Swap Two Elements in an ArrayList in Java?
We can swap two elements of Array List using Collections.swap() method. This method accepts three arguments. The first argument is the ArrayList and the other two arguments are the indices of the elements. This method returns nothing. Syntax: public static void swap(List list, int a, int b); Parame
2 min read
Java Program to Print the Smallest Element in an Array
Java provides a data structure, the array, which stores the collection of data of the same type. It is a fixed-size sequential collection of elements of the same type. Example: arr1[] = {2 , -1 , 9 , 10} output : -1 arr2[] = {0, -10, -13, 5} output : -13 We need to find and print the smallest value
3 min read
Java Program for Last duplicate element in a sorted array
We have a sorted array with duplicate elements and we have to find the index of last duplicate element and print index of it and also print the duplicate element. If no such element found print a message. Examples: Input : arr[] = {1, 5, 5, 6, 6, 7} Output : Last index: 4 Last duplicate item: 6 Inpu
2 min read
Sort and Search an Element in Java
In Java sorting and searching an element in an array is very easy. Unlike C, where we have to make all the functions to work, Java has inbuilt functions to do the same work. To sort an array there is a sort function and to search an element in a sorted array there is a binarySearch() function. To le
3 min read
How to Find the Maximum Element in an Array?
In Java, the array is a data structure that allows the users to store data of the same type in contiguous memory locations. To find the maximum element in an Array in Java, we can sort the array in ascending order using the Arrays.sort() method and then we can access the last element of the array wh
1 min read
Finding Maximum Element of Java ArrayList
For finding the maximum element in the ArrayList, complete traversal of the ArrayList is required. There is an inbuilt function in the ArrayList class to find the maximum element in the ArrayList, i.e. Time Complexity is O(N), where N is the size of ArrayList, Let's discuss both the methods. Example
2 min read
Java Program to Find closest number in array
Given an array of sorted integers. We need to find the closest value to the given number. Array may contain duplicate values and negative numbers. Examples: Input : arr[] = {1, 2, 4, 5, 6, 6, 8, 9} Target number = 11 Output : 9 9 is closest to 11 in given array Input :arr[] = {2, 5, 6, 7, 8, 8, 9};
4 min read
Sort an Array and Insert an Element Inside Array in Java
Sorting an array can be done by using inbuilt sort function while for the insertion we have to create a new array to do so as arrays in Java are immutable. To learn more about sorting in Java follow the article mentioned below: Sorting: Arrays.sort() in Java with examples Approach 1: Create a new ar
3 min read