The Two Sum problem is a common algorithmic problem where you are given an array of integers and a target sum. The objective is to determine if there are two numbers in the array that add up to the specified target sum.
This implementation uses a hash map (or hash table) for efficient lookup of the required numbers. The time complexity of this solution is O(n), making it efficient for large input sizes.
Program Structure
- Includes and Definitions: Necessary header files and type definitions.
- Hash Map Implementation: A structure to handle the hash map operations.
- Main Function: The logic for the Two Sum problem and handling input/output.
Code Explanation
#include #include // Define a hash map entry typedef struct HashMapEntry { int key; // The number from the array int value; // The index of that number } HashMapEntry; // Define a hash map structure typedef struct HashMap { HashMapEntry *entries; int size; } HashMap; // Hash function to calculate the index int hash(int key, int size) { return abs(key) % size; // Ensure a non-negative index } // Function to create a hash map HashMap *createHashMap(int size) { HashMap *map = malloc(sizeof(HashMap)); map->entries = malloc(sizeof(HashMapEntry) * size); map->size = size; for (int i = 0; i < size; i++) { map->entries[i].key = 0; // Initialize keys map->entries[i].value = -1; // Initialize values } return map; } // Function to insert into the hash map void insert(HashMap *map, int key, int value) { int index = hash(key, map->size); while (map->entries[index].value != -1) { index = (index + 1) % map->size; // Linear probing } map->entries[index].key = key; map->entries[index].value = value; } // Function to find a value in the hash map int find(HashMap *map, int key) { int index = hash(key, map->size); while (map->entries[index].value != -1) { if (map->entries[index].key == key) { return map->entries[index].value; // Return index if found } index = (index + 1) % map->size; // Linear probing } return -1; // Not found } // Function to solve the Two Sum problem void twoSum(int *nums, int numsSize, int target) { HashMap *map = createHashMap(numsSize); for (int i = 0; i < numsSize; i++) { int complement = target - nums[i]; int foundIndex = find(map, complement); if (foundIndex != -1) { printf("Indices: %d, %d\n", foundIndex, i); free(map->entries); free(map); return; } insert(map, nums[i], i); } printf("No two sum solution found.\n"); free(map->entries); free(map); } // Main function int main() { int nums[] = {2, 7, 11, 15}; int target = 9; int numsSize = sizeof(nums) / sizeof(nums[0]); twoSum(nums, numsSize, target); return 0; }
How to Compile and Run
- Save the code in a file named
two_sum.c
. - Open a terminal and navigate to the directory containing the file.
- Compile the program using
gcc two_sum.c -o two_sum
. - Run the executable using
./two_sum
.
Explanation:
- C Program: The program uses a hash map to store numbers and their indices while iterating through the array to check for the complement (the number that, when added to the current number, equals the target).
- Functions:
hash()
: Computes an index for a given key.createHashMap()
: Initializes a hash map.insert()
: Adds a key-value pair to the hash map.find()
: Looks up a key in the hash map.twoSum()
: Main logic to find the two numbers that add up to the target.
- Main Function: Demonstrates the use of the
twoSum()
function with a sample array and target.