今天要写的题目有哪些呢?
747. 至少是其他数字两倍的最大数 - 力扣(LeetCode)
int dominantIndex(int* nums, int numsSize) { int max=0; max=nums[0]; int index=0; for(int i=1;i<numsSize;i++) { if(nums[i]>max){ max=nums[i]; index=i; i++;//找出最大的元素 } } for(int i=0;i<numsSize;i++)//检查是否是其他元素的两倍 { if(i!=index&&max<2*nums[i]){ return -1; } } return index; }
我们可以使用排序和双指针的方法来解决这个问题。首先,对两个数组进行排序,然后使用双指针分别遍历两个数组,比较指针所指向的元素。如果两个元素相等,则将其添加到结果数组中,并将两个指针都向前移动一位。如果两个元素不相等,则将指向较小元素的指针向前移动一位。
#include <stdio.h> #include <stdlib.h> // 比较函数,用于qsort int compare(const void *a, const void *b) { return (*(int *)a - *(int *)b); } // 获取两个数组的交集 int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) { // 对两个数组进行排序 qsort(nums1, nums1Size, sizeof(int), compare); qsort(nums2, nums2Size, sizeof(int), compare); int *result = (int *)malloc(sizeof(int) * (nums1Size < nums2Size ? nums1Size : nums2Size)); //这行代码的目的是为存储两个数组的交集分配足够的内存。由于交集的大小不会超过两个数组中的较小者,因此分配的内存大小是 sizeof(int) 乘以较小数组的大小。这个内存块将用于存储找到的交集元素。之后,这个 result 指针将被用于填充交集元素,并最终返回给调用者 int resultIndex = 0; int i = 0, j = 0; //定义两个指针,分别用于遍历两个数组 // 使用双指针遍历两个数组 while (i < nums1Size && j < nums2Size) { if (nums1[i] == nums2[j]) {//如果两个数组在当前位置的元素相等,那么它们是交集的一部分 // 如果找到交集元素,将其添加到结果数组中 result[resultIndex++] = nums1[i]; //将交集元素添加到结果数组中,并更新resultIndex // 跳过重复元素 while (i < nums1Size - 1 && nums1[i] == nums1[i + 1]) i++; while (j < nums2Size - 1 && nums2[j] == nums2[j + 1]) j++; i++; 移动两个数组的指针到下一个元素 j++; } else if (nums1[i] < nums2[j]) { i++; //如果nums1的当前元素小于nums2的当前元素,则移动nums1的指针;否则,移动nums2的指针 } else { j++; } } *returnSize = resultIndex; // 设置返回结果的大小 return result; } int main() { int nums1[] = {1, 2, 2, 1}; int nums2[] = {2, 2}; int returnSize; int *result = intersect(nums1, 4, nums2, 2, &returnSize); printf("Intersection: "); for (int i = 0; i < returnSize; i++) { printf("%d ", result[i]); } printf("\n"); free(result); // 释放动态分配的内存 return 0; }