Total Occurrence of Target

本文介绍了一种在升序整数数组中查找特定目标数总出现次数的方法,通过二分查找找到目标数的最后一个位置,然后逆向统计相同元素的数量,实现了O(logn)的时间复杂度。

Given a target number and an integer array sorted in ascending order. Find the total number of occurrences of target in the array.

Example

Example1:

Input: [1, 3, 3, 4, 5] and target = 3, 
Output: 2.

Example2:

Input: [2, 2, 3, 4, 6] and target = 4, 
Output: 1.

Example3:

Input: [1, 2, 3, 4, 5] and target = 6, 
Output: 0.

Challenge

Time complexity in O(logn)

思路:先find到target index,如果-1直接return 0.否则再统计;

public class Solution {
    /**
     * @param A: A an integer array sorted in ascending order
     * @param target: An integer
     * @return: An integer
     */
    public int totalOccurrence(int[] A, int target) {
        if(A == null || A.length == 0) {
            return 0;
        }
        
        int i = findLastIndex(A, target);
        if(i == -1) {
            return 0;
        } 
        int count = 0;
        while(i >= 0) {
            if(A[i] == target){
                count++;
                i--;
            } else {
                break;
            }
        }
        return count;
    }
    
    private int findLastIndex(int[] A, int target) {
        int start = 0; int end = A.length - 1;
        while(start + 1 < end) {
            int mid = start + (end - start) / 2;
            if(A[mid] <= target) {
                start = mid;
            } else {
                end = mid;
            }
        }
        if(A[end] == target) {
            return end;
        } 
        if(A[start] == target){
            return start;
        }
        return -1;
    }
}

 

linking... carL\carL.axf: Error: L6218E: Undefined symbol Get_Left_Encoder (referred from main.o). carL\carL.axf: Error: L6218E: Undefined symbol Get_Right_Encoder (referred from main.o). carL\carL.axf: Error: L6218E: Undefined symbol Move_Forward (referred from main.o). Not enough information to list image symbols. Not enough information to list load addresses in the image map. Finished: 2 information, 0 warning and 3 error messages. "carL\carL.axf" - 3 Error(s), 0 Warning(s). Target not created. 以下是现有的代码 encoder.c #include "encoder.h" #include "tim.h" void Reset_Encoders(void) { htim3.Instance->CNT = 0; htim4.Instance->CNT = 0; } float Get_Total_Distance(void) { int32_t left_ticks = htim3.Instance->CNT; int32_t right_ticks = htim4.Instance->CNT; float distance = (left_ticks + right_ticks) / 2.0f * 0.1f; return distance; } motion.c #include "motion.h" #include "encoder.h" #include "motor.h" #include "jy61p.h" #include "math.h" #include "stddef.h" void Turn_Left(int angle) { float target_angle = angle; float current_yaw = 0.0f; JY61P_Data imu_data; while (fabsf(current_yaw) < target_angle) { Motor_Turn_Left(50); JY61P_Read_Attitude(&imu_data); current_yaw = imu_data.yaw; } Motor_Stop(); } void Turn_Right(int angle) { float target_angle = angle; float current_yaw = 0.0f; JY61P_Data imu_data; while (fabsf(current_yaw) < target_angle) { Motor_Turn_Right(50); JY61P_Read_Attitude(&imu_data); current_yaw = imu_data.yaw; } Motor_Stop(); } encoder.h #ifndef __ENCODER_H #define __ENCODER_H void Reset_Encoders(void); float Get_Total_Distance(void); float Get_Left_Encoder(void); float Get_Right_Encoder(void); #endif motion.h #ifndef __MOTION_H #define __MOTION_H void Move_Forward(int distance); void Move_Backward(int distance); void Turn_Left(int angle); void Turn_Right(int angle); #endif main.c /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2025 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "i2c.h" #include "tim.h" #include "usart.h" #include "gpio.h" #include "jy61p.h" #include "pid.h" #include "kalman_filter.h" #include "motor.h" #include "encoder.h" #include "ultrasonic.h" #include "motion.h" #include "stdio.h" #include "string.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ // Ô²ÖùÐÅÏ¢½á¹¹Ìå #define MAX_CYLINDERS 10 typedef struct { int x, y, r; char color; } Cylinder; Cylinder cylinders[MAX_CYLINDERS]; int cylinder_count = 0; uint8_t mission_running = 0; uint32_t start_time = 0; uint32_t timeout = 10000; // 10s uint8_t rx_byte; char openmv_buffer[128]; uint8_t openmv_index = 0; // ÈÎÎñģʽö¾Ù typedef enum { TASK_SIMPLE_EXIT, TASK_SNAKE_PATH, TASK_CIRCLE_TWO_COLORS, TASK_COLUMN_SWAP, TASK_RANDOM_DETECT } TaskMode; TaskMode current_task = TASK_SIMPLE_EXIT; /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ void StartMission(void); void ExecuteMission(TaskMode task); void SimpleExitPath(void); void SnakePath(void); void CircleTwoColors(void); void ColumnSwapPath(void); void RandomDetectPath(void); void AddCylinder(int x, int y, int r, char color); void BuildPath(char color); void AvoidObstacle(void); void Send_Debug_Info(void); /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart == &huart1) { if (rx_byte >= '1' && rx_byte <= '5') { current_task = rx_byte - '1'; // 1~5 Ó³É䵽ö¾Ù printf("Selected Task: %d\r\n", current_task + 1); } HAL_UART_Receive_IT(&huart1, &rx_byte, 1); //¼ÌÐø½ÓÊÕ } } // Æô¶¯ÈÎÎñ void StartMission() { mission_running = 1; start_time = HAL_GetTick(); } // ÊÇ·ñ³¬Ê± uint8_t IsMissionTimeout() { return (HAL_GetTick() - start_time) > timeout; } // Ä£¿éÊý¾Ý½á¹¹Ìå JY61P_Data imu_data; PID_Controller speed_pid, angle_pid; KalmanFilter kf; // ¿ØÖƲÎÊý float target_speed = 100; float base_pwm = 70; float dt = 0.01; // ¿ØÖÆÖÜÆÚ/Ãë void Control_Straight(void); void Avoid_Obstacle(void); void Send_Debug_Info(void); // PID ¿ØÖÆÖ±ÐÐ void Control_Straight(void) { float left_speed = Get_Left_Encoder(); float right_speed = Get_Right_Encoder(); float error = left_speed - right_speed; float correction = PID_Update(&angle_pid, error, dt); float left_pwm = base_pwm + correction; float right_pwm = base_pwm - correction; Motor_SetSpeed(left_pwm, right_pwm); } // PID ¿ØÖÆ×ªÏòº¯Êý void SetTargetYaw(float angle) { printf("Turning %.1f degrees\n", angle); HAL_Delay(500); } // Ìí¼ÓÔ²Öùµ½µØÍ¼ void AddCylinder(int x, int y, int r, char color) { if (cylinder_count < MAX_CYLINDERS) { cylinders[cylinder_count].x = x; cylinders[cylinder_count].y = y; cylinders[cylinder_count].r = r; cylinders[cylinder_count].color = color; cylinder_count++; } } // ¹¹½¨ÈÆÏß·¾¶ void BuildPath(char color) { if (color == 'W') { SetTargetYaw(-180.0f); // °××ó } else if (color == 'B') { SetTargetYaw(180.0f); // ºÚÓÒ } } //±ÜÕÏ void AvoidObstacle() { float left = Get_Left_Distance(); float right = Get_Right_Distance(); if (left < 10 && right < 10) { Motor_Stop(); printf("Obstacle detected in both directions. Stopping.\r\n"); } else if (left < 10) { Turn_Right(90); } else if (right < 10) { Turn_Left(90); } } //¼òµ¥Â·¾¶ void SimpleExitPath() { Move_Forward(100); Turn_Right(90); Move_Forward(50); } //ÉßÐη¾¶ void SnakePath() { for (int i = 0; i < cylinder_count; i++) { if (i % 2 == 0) { Turn_Left(90); } else { Turn_Right(90); } Move_Forward(20); } } //ÈÆÁ½¸öÑÕɫԲÖù void CircleTwoColors() { char colors_seen[2] = {0}; int count = 0; for (int i = 0; i < cylinder_count && count < 2; i++) { if (colors_seen[0] == 0 && cylinders[i].color == 'W') { BuildPath('W'); colors_seen[0] = 'W'; count++; } else if (colors_seen[1] == 0 && cylinders[i].color == 'B') { BuildPath('B'); colors_seen[1] = 'B'; count++; } } } //ºÚ°×Öù½»»»ºó·¾¶ void ColumnSwapPath() { //¼ÙÉèÒѽ»»»Öù×ÓÖØÐ¹滮·¾¶ BuildPath('W'); BuildPath('B'); } // Ëæ»ú̽²â·¾¶ void RandomDetectPath() { // ½ÓÊÕOpenMV Êý¾Ý HAL_UART_Receive_IT(&huart1, &rx_byte, 1); HAL_Delay(30000); // 30s BuildPath('W'); // ¼ÙÉè̽²âµ½°×Öù Move_Forward(100); } // ÈÎÎñÖ´Ðк¯Êý void ExecuteMission(TaskMode task) { switch (task) { case TASK_SIMPLE_EXIT: SimpleExitPath(); break; case TASK_SNAKE_PATH: SnakePath(); break; case TASK_CIRCLE_TWO_COLORS: CircleTwoColors(); break; case TASK_COLUMN_SWAP: ColumnSwapPath(); break; case TASK_RANDOM_DETECT: RandomDetectPath(); break; } } /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_I2C1_Init(); MX_TIM2_Init(); MX_TIM3_Init(); MX_TIM4_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ HAL_UART_Receive_IT(&huart1, &rx_byte, 1); StartMission(); //Æô¶¯±àÂëÆ÷¼ÆÊý HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL); HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_ALL); // ³õʼ»¯ IMU JY61P_Init(&hi2c1); // ³õʼ»¯ PID PID_Init(&speed_pid, 1.0f, 0.1f, 0.05f); PID_Init(&angle_pid, 2.0f, 0.0f, 0.1f); // ³õʼ»¯ ¿¨¶ûÂüÂ˲¨ KalmanFilter_Init(&kf, 0.001f, 0.003f, 0.03f); // Æô¶¯ PWM Êä³ö HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); //Ìí¼Ó²âÊÔÔ²Öù AddCylinder(100, 200, 30, 'W'); AddCylinder(300, 150, 35, 'B'); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) { HAL_Delay(20); if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) { StartMission(); while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET); // µÈ´ýÊÍ·Å } } if (mission_running) { ExecuteMission(current_task); //Ö´Ðе±Ç°ÈÎÎñ if (IsMissionTimeout()) { mission_running = 0; Motor_Stop(); printf("Mission Timeout!\r\n"); } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ /* USER CODE END 3 */ } } } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */
最新发布
08-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值